
[英]Joining pandas dataframes where indexes have different number of ordered rows
[英]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.