繁体   English   中英

从 3 个不同的 Pandas 数据帧中查找相同的行,其中行的顺序不同

[英]Finding identical rows from 3 different pandas dataframes where rows are not similarly ordered

我有三个不同的熊猫数据框。 一个数据帧中的行顺序与其他数据帧的行顺序无关。 我想找到一个带有行的数据帧,其中每一行都将存在于某个索引处的三个原始数据帧中(不同数据帧之间可能不同)。

让我们看一个例子:

import pandas as pd 

# initialize list of lists 
data1 = [['tom', 10], ['mike', 15], ['lucy', 20], ['jerry', 5]] 
data2 = [['david', 5], ['bran', 6], ['tom', 10], ['mike', 15], ['jimmy', 20], ['kevin', 5], ['juli', 6]]
data3 = [['mike', 15], ['tom', 10], ['lucy', 20], ['ron', 5]]

# Create the pandas DataFrame 
df1 = pd.DataFrame(data1, columns = ['Name', 'Age']) 
df2 = pd.DataFrame(data2, columns = ['Name', 'Age']) 
df3 = pd.DataFrame(data3, columns = ['Name', 'Age'])

如果我们打印这些数据帧,我们会得到

>> df1

    Name    Age
0   tom     10
1   mike    15
2   lucy    20
3   jerry   5

>> df2
    Name    Age
0   david   5
1   bran    6
2   tom     10
3   mike    15
4   jimmy   20
5   kevin   5
6   juli    6

>> df3
    Name    Age
0   mike    15
1   tom     10
2   lucy    20
3   ron     5

请注意,具有值(tom, 10)(mike, 15)出现在所有 3 个数据帧中。 因此,我要创建的数据框如下所示(行的顺序不相关):

    Name    Age
  0 mike    15
  1 tom     10

我怎样才能以有效的方式做到这一点? 在我的实际问题中,我有 6 列,每个数据框中的行数可以在 30 到 200 之间。

您可以使用 pivot 然后使用 aggfunc='size' 来做到这一点:

df = pd.concat([df1,df2,df3]) 
maxlen = df.pivot_table(index=['Name', 'Age'], aggfunc='size').max()
new_df = (df.pivot_table(index=['Name', 'Age'], aggfunc='size') == maxlen).reset_index() 
new_df[new_df[0] == True].reset_index(drop=True).drop(columns=0)


   Name  Age
0  mike   15
1   tom   10

您还可以使用 groupby (更简单的解决方案):

new_df = pd.concat([df1,df2,df3]).groupby(['Name','Age']).size() 
new_df[new_df == new_df.max()] 

Name  Age
mike  15     3
tom   10     3
dtype: int64

如果您不想要额外的列:

new_df[new_df == new_df.max()].reset_index().drop(columns=0)

   Name  Age
0  mike   15
1   tom   10

我在 Pandas Dataframe 中使用了合并。

pd.merge(pd.merge(df1, df2, how = 'inner', on='Name'), df3, how='inner', on='Name')

专家,您能评论一下这种方法吗? 我确信它最适合两个数据帧。

暂无
暂无

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

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