2016-03-04 75 views
2

我是熊貓的新手,懷疑這有一個簡單的答案,但它現在正在困擾着我。我想從多個數據框(具有相同列)中選擇一行中的值出現在所有數據框中的行。通過多個熊貓數據框中的常見值進行選擇

所以,如果我有以下幾點:

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 

有一個簡潔的方式來做到這一點?

回答

0

一個解決辦法是先獲取Col1中的存在於所有DataFrames的值,然後限制每個DataFrames的這些共同的價值觀,然後串聯受限DataFrames:

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 
2

您可以先找到共同的價值觀:

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') 
0

首先,創建一個容器來容納你的數據框(dfs)。您可以在Col1的名稱集交集上使用reduce在所有數據框中查找名稱。最後,您可以使用query和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應該dataframes數量改變的內容。

P.S.重讀這個問題後,我意識到你是熊貓的新手。歡迎!儘管熊貓的功能非常強大,但對於您的問題沒有簡單的解決方案。基本上,你想過濾你的數據框來獲得一個通用名稱列表。然後,您要篩選這些名稱的每個數據框,並連接結果。