如何在Pandas DataFrame中返回所有相对的对?

时间:2015-06-02 16:19:45

标签: python pandas match dataframe

对于下面的数据框,如何返回所有相反的对?

import pandas as pd
df1 = pd.DataFrame([1,2,-2,2,-1,-1,1,1], columns=['a'])

   a
0  1
1  2
2 -2
3  2
4 -1
5 -1
6  1
7  1    

输出应如下:

  

(1)所有行的总和为0
  (2)因为有3" 1"和2" -1"在   原始数据,输出包括2" 1"和2" -1"。

   a
0  1
1  2
2 -2
4 -1
5 -1
6  1

非常感谢。

1 个答案:

答案 0 :(得分:0)

嗯,我认为这会花费更少的线(并且可能会),但这确实有效。首先,只需创建几个新列以简化后面的语法:

>>> df1['abs_a'] = np.abs( df1['a'] )
>>> df1['ones'] = 1

然后你需要的主要是做一些计数。例如,1或更少-1 s的数量会减少吗?

>>> df2 = df1.groupby(['abs_a','a']).count()

          ones
abs_a a       
1     -1     2
       1     3
2     -2     1
       2     2

>>> df3 = df2.groupby(level=0).min()

       ones
abs_a      
1         2
2         1

这基本上就是那里的答案,但我会把它放在你要求的表格附近:

>>> lst = [ [i]*j for i, j in zip( df3.index.tolist(), df3['ones'].tolist() ) ]
>>> arr = np.array( [item for sublist in lst for item in sublist] )

>>> np.hstack( [arr,-1*arr] )

array([ 1,  1,  2, -1, -1, -2], dtype=int64)

或者如果你想把它放回数据帧:

>>> pd.DataFrame( np.hstack( [arr,-1*arr] ) )

   0
0  1
1  1
2  2
3 -1
4 -1
5 -2