Python pandas concat相交

时间:2014-01-21 13:55:53

标签: python pandas concat

我很难在pandas中获得两个DataFrame的交集。

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个DataFrame的交集,所以结果中只出现第8到第10行。

当我将轴更改为1时,join ='intersect'似乎开始工作但结果不是我真正需要的:

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不起作用?如何通过索引连接DataFrame?

2 个答案:

答案 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上使用唯一索引。

答案 1 :(得分: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

但是我认为可能还有其他一些运行时间较少的方法来解决我的问题。如果您有任何建议,请不要犹豫。