如何在pandas DataFrame列中处理类似列表的数据

时间:2017-05-25 20:23:30

标签: pandas

考虑以下示例:

我有一个电子邮件表,每个都有一个电子邮件ID,还有两个标签列,通过不同的代码路径生成,包含与这些电子邮件关联的标签列表。

df = pd.DataFrame({
    'id': [1,2,3,4],
    'labels1': [np.array(['red']), np.array(['blue', 'green']), np.array(['blue']), np.nan],
    'labels2': [np.nan, np.nan, np.array(['yellow', 'purple']), np.array(['magenta'])]
})

df
   id        labels1           labels2
0   1          [red]               NaN
1   2  [blue, green]               NaN
2   3         [blue]  [yellow, purple]
3   4            NaN         [magenta]


所以,我需要一种方法来生成以下DataFrame:

df_merge
    id                 labels       
0   1                   [red] 
1   2           [blue, green] 
2   3  [blue, yellow, purple] 
3   4               [magenta]

但是使用lambda函数,就像我对标量列数据一样,会引发ValueError异常:

df.apply(lambda x: np.unique(np.append(x['labels1'], x['labels2'])), axis=1)

ValueError: Shape of passed values is (4, 2), indices imply (4, 4)

我在上面尝试了很多不同的变化,但都无济于事。我想知道像这样的类似阵列的列数据是否是熊猫反模式,如果是这样,有什么更好的方法呢?

1 个答案:

答案 0 :(得分:3)

  • 使用NaN
  • []变为applymap
  • sum跨行
df[['id']].assign(
    labels=labels.applymap(lambda x: x if isinstance(x, list) else []).sum(1)
)

   id                  labels
0   1                   [red]
1   2           [blue, green]
2   3  [blue, yellow, purple]
3   4               [magenta]