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