【问题标题】:Extract unique rows from two data file从两个数据文件中提取唯一行
【发布时间】:2018-10-17 19:04:34
【问题描述】:

我有两个大的 excel 文件,想提取每个文件中唯一的行。

例如,我有

df1 = pd.DataFrame({'Value': [100,50,20,10],
'C1': ['a','b','c','d'],
'C2': ['g','h','i','j'],})

df2 = pd.DataFrame({'Value': [100,40,20,5],
'C1': ['a','z','c','d'],
'C2': ['g','h','i','m'],})

第一行和第三行在 df1 和 df2 之间共享。 (a,g,100 或 c,i,20) df1 和 df2 之间不共享第二行和第四行,我想提取这些行。 (b,h,50.d,j,10.z,h,40 和 d,m,5)。

如果你能告诉我如何使用 python 做到这一点,我将非常感激。

感谢大家的反馈。 如果我能得到低于输出,那就太好了。

df1only=pd.DataFrame({'Value': [50,10],'C1': ['b','d'],'C2': ['h','j'],})

df2only = pd.DataFrame({'Value': [40,5],'C1': ['z','d'],'C2': ['h','m']})

【问题讨论】:

  • 你能提供一个你想要的输出的例子吗?
  • 你想要一个数据框还是保留两个?
  • 我以前见过这个。一种方法是创建一个掩码:m = ~df1.isin(df2).all(1),然后按以下方式访问这些值:df1[m]df2[m],或者将它们全部放在一起pd.concat([df1,df2]).loc[m]
  • 对于一个数据框使用pd.merge(df1,df2, on=['Value', 'C1', 'C2']) 否则创建@AntonvBR 建议的掩码

标签: python pandas unique extract


【解决方案1】:

在创建tuple 后使用symmetric_difference

set(df1.apply(tuple,1)).symmetric_difference(set(df2.apply(tuple,1)))
Out[653]: {('b', 'h', 50), ('d', 'j', 10), ('d', 'm', 5), ('z', 'h', 40)}

或者干脆

set(df1.apply(tuple,1))^set(df2.apply(tuple,1))
Out[654]: {('b', 'h', 50), ('d', 'j', 10), ('d', 'm', 5), ('z', 'h', 40)}

【讨论】:

  • 如果您只想获取值,这是最好的方法。
  • @d_kennetz 然而,这与熊猫无关。但是我们经常需要对期望的输出做出假设。 OP 可能希望保留数据帧格式,在这种情况下,这并不是真正需要的。
【解决方案2】:

例如,您可以。

1) 创建一个不重复的蒙版(~ 反转选择)。感谢 Wen 对此解决方案的评论,您的索引需要对齐。

m = ~df1.isin(df2).all(1)
# Access dataframe with one of below
#df1[m]
#df2[m]
#pd.concat([df1,df2]).loc[m]

2) 从连接的数据框中删除重复项(故障安全,假设您的值是 3 组)

df = pd.concat([df1,df2])
df.loc[~df.duplicated(keep=False)]

3) 您可以作为 2 的变体将 lambda 函数传递给 loc。

df = pd.concat([df1,df2]).loc[lambda x: ~x.duplicated(keep=False)]

【讨论】:

【解决方案3】:

这将根据合并的位置添加一列:

merged = df1.merge(df2, indicator=True, how='outer')
final = merged[merged['_merge'] != 'both']
print(final)

这会对 df1 和 df2 进行右外合并,并添加一列指示合并发生的位置以及该行是 df 唯一的还是仅存在于其中一个中:

>>> merged[merged['_merge'] != 'both']
  C1 C2  Value      _merge
1  b  h     50   left_only
3  d  j     10   left_only
4  z  h     40  right_only
5  d  m      5  right_only

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多