【问题标题】:create a column which is the difference of two string columns in pandas创建一个列,它是熊猫中两个字符串列的差异
【发布时间】:2020-04-08 11:00:23
【问题描述】:

我有如下熊猫数据框:

df = pd.DataFrame ({'col1': ['apple;orange;pear', 'grape;apple;kiwi;pear'], 'col2': ['apple', 'grape;kiwi']})

    col1                    col2
0   apple;orange;pear       apple
1   grape;apple;kiwi;pear   grape;kiwi

我需要如下数据:

    col1                     col2        col3
0   apple;orange;pear       apple       orange;pear
1   grape;apple;kiwi;pear   grape;kiwi  apple;pear

有人知道怎么做吗?谢谢。

在本例中,col2 grape;kiwi 的第二行,子字符串在 col1 grape;apple;kiwi;pear 的第二行的不同位置。 [How do I create a new column in pandas from the difference of two string columns? 在我的情况下不起作用。

【问题讨论】:

  • 尝试了什么?

标签: python pandas


【解决方案1】:

您可以使用 set 来查找差异。作为第一步,您需要将字符串转换为集合。

df['col3'] = (
    df.apply(lambda x: ';'.join(set(x.col1.split(';')).difference(x.col2.split(';'))), 
             axis=1)
)

    col1                col2        col3
0   apple;orange;pear   apple       orange;pear
1   grape;apple;kiwi    grape;kiwi  apple;pear

【讨论】:

  • 有效,但你如何解释 set 是无序的事实。所以当你合并回来时,它可能是梨,橙色而不是橙色,梨。我猜OP并不关心这一点。只是一点点。如果您对此有建议,那就太好了
  • 如果订单很重要,我会使用 OrderedDict。
【解决方案2】:

str.get_dummies的魔力

s=df.col1.str.get_dummies(';').sub(df.col2.str.get_dummies(';'),fill_value=0)
df['col3']=s.eq(1).dot(s.columns+';').str[:-1]
df
                    col1        col2         col3
0      apple;orange;pear       apple  orange;pear
1  grape;apple;kiwi;pear  grape;kiwi   apple;pear

【讨论】:

  • 与预期输出不匹配
  • @sammywemmy 我使用他的代码创建的 df,而不是他显示的,让我更新
  • 是的,他发布的代码不正确。也注意到了
  • 不错@YOBEN。干净,保持秩序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
相关资源
最近更新 更多