我有一个pandas数据框,其中一列RESULT在列表内有列表。
ID RESULT
0 A [nan, ['PASS'], nan, nan]
1 B [['FAIL'], nan, nan, nan]
2 C [['PASS'], nan, nan, nan]
3 D [nan, nan, nan, nan]
4 E [nan, ['FAIL'], nan, nan]
我想使RESULT列成为平面列表。例如,第一种情况是[nan,'PASS',nan,nan]。最终答案应如下所示。
ID RESULT
0 A [nan, 'PASS', nan, nan]
1 B ['FAIL', nan, nan, nan]
2 C ['PASS', nan, nan, nan]
3 D [nan, nan, nan, nan]
4 E [nan, 'FAIL', nan, nan]
我试图创建一个函数,但是没有将列更新为平面列表。下面是我尝试的代码。
def flatten_list(mylist):
# print(mylist)
for index, value in enumerate(mylist):
if type(value) is list:
mylist[index] = value[0]
# print(mylist)
return mylist
df_bin['RESULT'] = df_bin['RESULT'].apply(flatten_list)
但是,如果我尝试下面的简单示例,它会起作用。我不知道有什么区别。我将不胜感激。也可以使用lambda函数获得相同的结果。
mylist = [nan, ['PASS'], nan, nan]
for n, i in enumerate(mylist):
if type(i) is list:
mylist[n] = i[0]
print(mylist)
答案 0 :(得分:2)
可以使用pandas.core
中的内部import pandas as pd
from pandas.core.common import flatten
df = pd.DataFrame({'ID':['A','B'],
'Result':[['nan', ['PASS'], 'nan', 'nan'], [['FAIL'], 'nan', 'nan', 'nan']]
})
df['Result'] = df['Result'].apply(lambda x: list(flatten(x)))
功能来做到这一点
ID Result
0 A [nan, PASS, nan, nan]
1 B [FAIL, nan, nan, nan]
输出:
stderr
根据您的示例,我认为这应该可行。
答案 1 :(得分:1)
您快到了,您必须取消return语句的缩进
def flatten_list(mylist):
# print(mylist)
for index, value in enumerate(mylist):
if type(value) is list:
mylist[index] = value[0]
# print(mylist)
return mylist # <- indentation issue here.
如果您的子列表包含多个项目,这是一种更通用的解决方案。
def flatten_list(cell):
fcell = []
for item in cell:
if isinstance(item, list):
fcell += item
else:
fcell += [item]
return fcell
df_bin['RESULT'] = df_bin['RESULT'].apply(flatten_list)
答案 2 :(得分:1)
一种更有效的方式(如果您关心性能)是避免循环并改用numpy.hstack。这是一个例子。
from numpy import hstack, nan
lst= [nan, ['PASS'], nan, nan]
lst2 = list(hstack(lst))
print(lst2)
输出:
['nan', 'PASS', 'nan', 'nan']