2014-01-21 83 views
0

我很難在熊貓中獲得兩個DataFrame的交集。Python pandas concat intersect

In [22]: df1[0:10] 
Out[22]: 
       0 1 2 3 4 5 6 7 
0793oezim  3 NaN NaN NaN NaN NaN NaN NaN 
Dashkent  6 7 15 4 4 1 1 NaN 
Deniskildeev 3 NaN NaN NaN NaN NaN NaN NaN 
Krylova  3 NaN NaN NaN NaN NaN NaN NaN 
Ksusha  12 2 4 4 NaN NaN NaN NaN 
Rusel1994  3 NaN NaN NaN NaN NaN NaN NaN 
Sportsman  31 1 2 4 4 NaN NaN NaN 
User495  6 7 15 3 4 3 NaN NaN 
User498  12 10 4 NaN NaN NaN NaN NaN 
User499  4 23 5 9 NaN NaN NaN NaN 

[10 rows x 8 columns] 

In [23]: test = [df1[0:10],df1[8:10]] 

In [24]: pd.concat(test,axis=0,join='inner') 
Out[24]: 
       0 1 2 3 4 5 6 7 
0793oezim  3 NaN NaN NaN NaN NaN NaN NaN 
Dashkent  6 7 15 4 4 1 1 NaN 
Deniskildeev 3 NaN NaN NaN NaN NaN NaN NaN 
Krylova  3 NaN NaN NaN NaN NaN NaN NaN 
Ksusha  12 2 4 4 NaN NaN NaN NaN 
Rusel1994  3 NaN NaN NaN NaN NaN NaN NaN 
Sportsman  31 1 2 4 4 NaN NaN NaN 
User495  6 7 15 3 4 3 NaN NaN 
User498  12 10 4 NaN NaN NaN NaN NaN 
User499  4 23 5 9 NaN NaN NaN NaN 
User498  12 10 4 NaN NaN NaN NaN NaN 
User499  4 23 5 9 NaN NaN NaN NaN 

[12 rows x 8 columns] 

我想要的是找到2個數據幀的索引的交集,所以只有第8到第10行出現在結果中。

當我改變軸1聯接=「交叉」似乎開始工作,但結果不是我真正需要的:

In [25]: pd.concat(test,axis=1,join='inner') 
Out[25]: 
      0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 
User498 12 10 4 NaN NaN NaN NaN NaN 12 10 4 NaN NaN NaN NaN NaN 
User499 4 23 5 9 NaN NaN NaN NaN 4 23 5 9 NaN NaN NaN NaN 

[2 rows x 16 columns] 

,因爲它增加了DataFrames內容一起作爲它應該做的。爲什麼concat over axis = 0不起作用?如何通過索引連接數據框?

回答

1

你想嘗試合併。 concat是膠合多個幀一起更好,合併將處理重疊行的檢測和所有:

In [107]: df1 
Out[107]: 
      index 0 1 2 3 4 5 6 7 
0  0793oezim 3 NaN NaN NaN NaN NaN NaN NaN 
1  Dashkent 6 7 15 4 4 1 1 NaN 
2 Deniskildeev 3 NaN NaN NaN NaN NaN NaN NaN 
3  Krylova 3 NaN NaN NaN NaN NaN NaN NaN 
4  Ksusha 12 2 4 4 NaN NaN NaN NaN 
5  Rusel1994 3 NaN NaN NaN NaN NaN NaN NaN 
6  Sportsman 31 1 2 4 4 NaN NaN NaN 
7  User495 6 7 15 3 4 3 NaN NaN 
8  User498 12 10 4 NaN NaN NaN NaN NaN 
9  User499 4 23 5 9 NaN NaN NaN NaN 

[10 rows x 9 columns] 

In [108]: df2 
Out[108]: 
    index 0 1 2 3 4 5 6 7 
8 User498 12 10 4 NaN NaN NaN NaN NaN 
9 User499 4 23 5 9 NaN NaN NaN NaN 

[2 rows x 9 columns] 

In [109]: pd.merge(df1, df2, how='inner') 
Out[109]: 
    index 0 1 2 3 4 5 6 7 
0 User498 12 10 4 NaN NaN NaN NaN NaN 
1 User499 4 23 5 9 NaN NaN NaN NaN 

[2 rows x 9 columns] 

注意,我重置索引(df1.reset_index())。如果可能的話,通常最好在DataFrame上有唯一的索引。

0

我試過各種方法來解決我的問題。這似乎是工作,以得到正確的結果只有一個就是下面的功能:

def dataFrameMaskSplitbyIndex(df1,df2): 
    mask1 = df1.index.isin(df2.index) 
    mask2 = df2.index.isin(df1.index) 
    tempdf = df1[-mask1] 
    dfleft = tempdf.copy() 
    tempdf = df2[-mask2] 
    dfright = tempdf.copy() 
    tempdf = df1[mask1] 
    dfcenter = tempdf.copy() 
    return dfleft,dfcenter,dfright 

但是我認爲有可能是其他一些不太昂貴的運行方式來解決我的問題。如果你有任何不要猶豫,建議他們。