带有 Assign 函数的循环无法正常工作
For loops w/ Assign Function Not Working Properly
我正在使用一个数据框,该数据框有多个列,其中包含我想解析为列表的不同元素。这些项目由双竖线 (||) 分隔。
我目前可以使用 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 中的项目分离到一个列表中,我可以编写实现 objective 的代码,如下所示:
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"].
我不确定如何重写我的函数来执行与传递给函数的列列表中的单个代码行等效的操作。我试过在函数中创建一个单独的变量,从列名称中去除引号,但这似乎没有帮助。
如有任何帮助,我们将不胜感激。
您可以使用 lambda 函数和应用函数来执行此操作:
DATA.apply(lambda x: x.str.split('\|\|'))
Out[33]:
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]
我正在使用一个数据框,该数据框有多个列,其中包含我想解析为列表的不同元素。这些项目由双竖线 (||) 分隔。
我目前可以使用 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 中的项目分离到一个列表中,我可以编写实现 objective 的代码,如下所示:
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"].
我不确定如何重写我的函数来执行与传递给函数的列列表中的单个代码行等效的操作。我试过在函数中创建一个单独的变量,从列名称中去除引号,但这似乎没有帮助。
如有任何帮助,我们将不胜感激。
您可以使用 lambda 函数和应用函数来执行此操作:
DATA.apply(lambda x: x.str.split('\|\|'))
Out[33]:
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]