如何扁平化熊猫数据框列中的列表?

时间:2020-11-01 02:44:58

标签: python pandas list dataframe

我有一个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)

3 个答案:

答案 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)

demo

答案 2 :(得分:1)

一种更有效的方式(如果您关心性能)是避免循环并改用numpy.hstack。这是一个例子。

from numpy import hstack, nan
lst= [nan, ['PASS'], nan, nan]

lst2 = list(hstack(lst))

print(lst2)

输出:

['nan', 'PASS', 'nan', 'nan']