【问题标题】:Compare columns in Pandas between two unequal size Dataframes for condition check比较两个大小不等的数据框之间的 Pandas 列以进行条件检查
【发布时间】:2020-02-11 10:02:58
【问题描述】:

我有两只熊猫 DF。大小不等。例如:

Df1
id     value
a      2
b      3
c      22
d      5 

Df2 
id     value
c      22
a      2

不,我想从 DF1 中提取那些与 DF2 中具有相同 ID 的 。现在我的第一种方法是运行 2 个 for 循环,例如:

x=[]
for i in range(len(DF2)):
    for j in range(len(DF1)):
        if DF2['id'][i] == DF1['id'][j]:
          x.append(DF1.iloc[j])    

现在这没关系,但是对于一个 400,000 行和另一个 5,000 行的 2 个文件,我需要一种高效的 Pythonic+Pnadas 方式

【问题讨论】:

  • 使用join 加入id 列上的数据集。加入后你会得到一些带有 NaN 值的行——你应该使用dropna 方法。然后过滤加入的数据 - 可能使用pd.apply 方法。
  • 嗨@404pio 这个建议对我非常有用。我想如果可以的话,我会把这个作为答案
  • 您可以为您的问题制定答案:stackoverflow.com/help/self-answer - 这是一种“知识库”。

标签: python pandas loops compare data-files


【解决方案1】:
import pandas as pd

data1={'id':['a','b','c','d'],
       'value':[2,3,22,5]}

data2={'id':['c','a'],
       'value':[22,2]}

df1=pd.DataFrame(data1)
df2=pd.DataFrame(data2)
finaldf=pd.concat([df1,df2],ignore_index=True)

concat后输出

   id   value
0   a   2
1   b   3
2   c   22
3   d   5
4   c   22
5   a   2

最终输出

finaldf.drop_duplicates()

    id  value
0   a   2
1   b   3
2   c   22
3   d   5

【讨论】:

    【解决方案2】:

    您可以连接 dataframes ,然后检查所有元素是否为 duplicated ,然后 drop_duplicates 并仅保留第一次出现:

    m = pd.concat((df1,df2))
    m[m.duplicated('id',keep=False)].drop_duplicates()
    

      id  value
    0  a      2
    2  c     22
    

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      df = df1[df1.set_index(['id']).index.isin(df2.set_index(['id']).index)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        • 2020-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多