简体   繁体   English

将pandas dataframe中的字典转换成list

[英]Convert dictionaries in pandas dataframe to list

I have a dataframe我有一个 dataframe

fruit1                   fruit2
[banana,apple,orange]    [apple,nuts,strawberry]
[apple,mango,grape]      [apple,mango,grape,guava]



My code for adding the two additional columns is我添加另外两个列的代码是


df["fruits_added"] = df.apply(lambda row: set(row.fruit2) - set(row.fruit1), axis=1)
df["fruits_deleted"] = df.apply(lambda row: set(row.fruit1) - set(row.fruit2), axis=1)

My desired output is我想要的 output 是

fruit1                   fruit2                       fruits_added         fruits_deleted
[banana,apple,orange]    [apple,nuts,strawberry]    [strawberry,nuts]     [banana,orange]
[apple,mango,grape]      [apple,mango,grape,guava]    [guava]               []



but I am getting dictionaries instead但我得到的是字典

fruit1                   fruit2                       fruits_added         fruits_deleted
[banana,apple,orange]    [apple,nuts,strawberry]      {strawberry,nuts}   {banana,orange}
[apple,mango,grape]      [apple,mango,grape,guava]    {guava}              {}



Any input is appreciated任何输入表示赞赏

You can use np.setdiff1d您可以使用np.setdiff1d

df['fruits_deleted'] = df.apply(lambda x: np.setdiff1d(x.fruit1, x.fruit2), axis=1)
df['fruits_added'] = df.apply(lambda x: np.setdiff1d(x.fruit2, x.fruit1), axis=1)

Convert sets to lists:将集合转换为列表:

df["fruits_added"] = df.apply(lambda row: list(set(row.fruit2) - set(row.fruit1)), axis=1)
df["fruits_deleted"] = df.apply(lambda row: list(set(row.fruit1) - set(row.fruit2)), axis=1)

Alternative solution:替代解决方案:

zipped = zip(df['fruit1'], df['fruit2'])
df["fruits_added"] = [list(set(y) - set(x)) for x, y in zipped]
df["fruits_deleted"] = [list(set(x) - set(y)) for x, y in zipped]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM