Python 在多个数据帧中按公共值选择

Python 在多个数据帧中按公共值选择,python,pandas,Python,Pandas,我是熊猫队的新手,我怀疑这有一个简单的答案,但这让我现在很困惑。我想从多个数据帧(具有相同的列)中选择行,其中一个列中的值出现在所有数据帧中 因此,如果我有以下几点: import numpy as np import pandas as pd df1 = pd.DataFrame({'Col1'['Adams','Baker','Cash','Jones','Thomas'],\ 'Col2': ['A','B','C','D','E'],'Col3':[10

我是熊猫队的新手,我怀疑这有一个简单的答案,但这让我现在很困惑。我想从多个数据帧(具有相同的列)中选择行,其中一个列中的值出现在所有数据帧中

因此,如果我有以下几点:

import numpy as np
import pandas as pd

df1 = pd.DataFrame({'Col1'['Adams','Baker','Cash','Jones','Thomas'],\
                'Col2': ['A','B','C','D','E'],'Col3':[10,11,12,13,14]})
df2 = pd.DataFrame({'Col1':['Adams','Cash','Fox','Jones','Johnson'],\
               'Col2': ['D','E','F','G','H'],'Col3':[40,50,60,70,80]})
df3 = pd.DataFrame({'Col1': ['Adams','Barns','Jones','Smith','Thomas'],\
               'Col2':['F','G','J','L','M'],'Col3':[21,21,22,23,24]})
print df1
print df2
print df3
给予:

     Col 1   Col2  Col3
0    Adams   A    10
1    Baker   B    11
2    Cash    C    12
3   Jones    D    13
4  Thomas    E    14
  Col1 Col2  Col3
0    Adams    D    40
1     Cash    E    50
2      Fox    F    60
3    Jones    G    70
4  Johnson    H    80
   Col1 Col2  Col3
0   Adams    F    21
1   Barns    G    21
2   Jones    J    22
3   Smith    L    23
4  Thomas    M    24
我想以以下方式结束:

Adams    A     10
Adams    D     40
Adams    F     21
Jones    D     13
Jones    G     70
Jones    J     22

有一种简洁的方法可以做到这一点吗?

一种解决方案是首先获取存在于所有数据帧中的Col1值,然后将每个数据帧限制为这些公共值,然后连接受限制的数据帧:

common_values = list(set(df1.Col1) & set(df2.Col1) & set(df3.Col1))
df = pd.concat([df1[df1.Col1.isin(common_values)], df2[df2.Col1.isin(common_values)], df3[df3.Col1.isin(common_values)]], ignore_index=True)
这将为您提供以下结果:

print(df)

    Col1 Col2  Col3
   Adams   A    10
   Jones   D    13
   Adams   D    40
   Jones   G    70
   Adams   F    21
   Jones   J    22
我还注意到您所需的数据帧已排序,如果是这样,您可以使用以下命令对其排序:

df = df.sort(['Col1', 'Col2', 'Col3'])
这将为您提供:

print(df)

    Col1 Col2  Col3
   Adams   A    10
   Adams   D    40
   Adams   F    21
   Jones   D    13
   Jones   G    70
   Jones   J    22

您可以首先找到常用值:

common = \
    set.intersection(set(df1.Col1), set(df2.Col1), set(df3.Col1))
pd.concat([
    df1[df1.Col1.isin(common)],
    df2[df2.Col1.isin(common)],
    df3[df3.Col1.isin(common)]]).sort_values(by='Col1')
然后连接其值在公共值集中的行:

common = \
    set.intersection(set(df1.Col1), set(df2.Col1), set(df3.Col1))
pd.concat([
    df1[df1.Col1.isin(common)],
    df2[df2.Col1.isin(common)],
    df3[df3.Col1.isin(common)]]).sort_values(by='Col1')

首先,创建一个容器来保存数据帧(
dfs
)。您可以在
Col1
中设置的名称交集上使用
reduce
,以查找所有数据帧中的名称。最后,可以与concat一起使用来连接相关行

dfs = (df1, df2, df3)

common_names = \
    reduce(lambda s, df: s.intersection(set(df.Col1)), # The set intersection of names.
           dfs[1:],  # Sequence of dataframes to pass through reduce starting with second.
           set(dfs[0].Col1))  # Seed reduce with the column of names from first dataframe.

>>> common_names
{'Adams', 'Jones'}

>>> pd.concat((df.query('Col1 in @common_names') for df in dfs), ignore_index=True
              ).sort_values('Col1')
    Col1 Col2  Col3
0  Adams    A    10
2  Adams    D    40
4  Adams    F    21
1  Jones    D    13
3  Jones    G    70
5  Jones    J    22
此解决方案可以很好地扩展,因为如果数据帧的数量发生变化,您只需更改dfs的内容

再读一遍这个问题后,我意识到你是个熊猫新手。欢迎虽然熊猫的力量令人难以置信,但你的问题没有简单的解决办法。基本上,您希望过滤数据帧以获得常见名称的列表。然后,您需要为这些名称过滤每个数据帧,并连接结果