按多个 pandas 数据框中的通用值进行选择

Rok*_*e W 4 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,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
Run Code Online (Sandbox Code Playgroud)

给予:

     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
Run Code Online (Sandbox Code Playgroud)

我想结束:

Adams    A     10
Adams    D     40
Adams    F     21
Jones    D     13
Jones    G     70
Jones    J     22
Run Code Online (Sandbox Code Playgroud)

有没有一种简洁的方法来做到这一点?

Ami*_*ory 5

你可以先找到共同的价值观:

common = \
    set.intersection(set(df1.Col1), set(df2.Col1), set(df3.Col1))
Run Code Online (Sandbox Code Playgroud)

然后连接其值在公共值集中的行:

pd.concat([
    df1[df1.Col1.isin(common)],
    df2[df2.Col1.isin(common)],
    df3[df3.Col1.isin(common)]]).sort_values(by='Col1')
Run Code Online (Sandbox Code Playgroud)