2014-01-21 59 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 

但是我认为有可能是其他一些不太昂贵的运行方式来解决我的问题。如果你有任何不要犹豫,建议他们。