【发布时间】:2018-01-16 19:11:18
【问题描述】:
我正在使用一个数据框,该数据框有几列,其中包含我想解析为列表的不同元素。这些项目由双管道 (||) 分隔。
我目前可以使用 assign 函数编写单行代码,该函数可以分隔单个列中的元素,但是我无法编写一个可以获取列列表并执行相同操作的函数在所有这些中发挥作用。
例如,假设我的数据框名为 DATA:
import pandas as pd
d1 = {'Column_1': ["SF||NYG","SF||NYG","SF||NYG",
"SF||NYG","SF||NYG","SF||NYG","SF||NYG"],
'Column_2': ["SF||NYG","SF||NYG","SF||NYG",
"SF||NYG","SF||NYG","SF||NYG","SF||NYG"]}
DATA = pd.DataFrame(d1)
print (DATA)
Column_1 Column_2
0 SF||NYG SF||NYG
1 SF||NYG SF||NYG
2 SF||NYG SF||NYG
3 SF||NYG SF||NYG
4 SF||NYG SF||NYG
5 SF||NYG SF||NYG
6 SF||NYG SF||NYG
如果我想将 Column_1 中的项目分成一个列表,我可以编写实现我目标的代码,如下所示:
DATA = DATA.assign(Column_1=DATA["Column_1"].str.split('\|\|'))
print(DATA)
Column_1 Column_2
0 [SF, NYG] SF||NYG
1 [SF, NYG] SF||NYG
2 [SF, NYG] SF||NYG
3 [SF, NYG] SF||NYG
4 [SF, NYG] SF||NYG
5 [SF, NYG] SF||NYG
6 [SF, NYG] SF||NYG
但是,如果我尝试编写一个抽象函数:
def sep_list(df, col_list, sep):
for col in col_list:
df = df.assign(col=df[col].str.split(sep))
该函数将运行,但列中的数据不会像我预期的那样被分离出来。本质上,数据看起来与进入函数时完全相同。我觉得它与“col=df[col]”部分有关,因为上面工作代码行中的第一个 col 没有被引号括起来,而且函数中的代码似乎会运行第一个 col用引号引起来(例如,"Column_1"=DATA["Column_1"] 而不是 Column_1=DATA["Column_1"]。
我不确定如何重写我的函数,以在传递给函数的列列表上执行相当于单个代码行的操作。我尝试在函数中创建一个单独的变量,该变量会从 col 名称中去除引号,但这似乎没有帮助。
任何帮助将不胜感激。
【问题讨论】:
-
这是一个骗子。大量矢量化解决方案可用于此类问题。像 df[['Column_1a', 'Column_1b']] = df['Column_1'].str.split('\|\|', expand = True)
标签: python function pandas assign separator