Python 如何在数据帧中返回所有相反的对?

Python 如何在数据帧中返回所有相反的对?,python,pandas,match,dataframe,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” 非常感谢。好吧,我想这会占用更少的线路(也许可以),但这确实有效。首先,只需创建两个新

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

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”


非常感谢。

好吧,我想这会占用更少的线路(也许可以),但这确实有效。首先,只需创建两个新列以简化后面的语法:

>>> df1['abs_a'] = np.abs( df1['a'] )
>>> df1['ones'] = 1
那么你需要做的主要事情就是数数。例如,是否有更少的
1
s或更少的
-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

为什么会有反对票?我觉得还可以。如果是复制品,有人能指出它吗?嗨,约翰,非常感谢你的帮助。如何返回这些行的原始索引,而不是值?在原始数据示例中,我只有一列数据来简化事情,但实际上还有其他列,所以我需要索引来恢复这些列。谢谢。我暂时不确定,可能是合并,但有几个复杂问题:(1)不是唯一标识符,所以你必须想出一种方法来伪造它(先排序,然后保存索引值),(2)你需要一个规则来删除那些。例如,您需要删除“2”的一个匹配项,但是哪一个?如果这解决了您的大部分问题,您可能希望继续并提出关于剩余部分的新问题(并指定您希望如何准确处理我在前面的评论中提到的问题2)。我很确定可以通过合并/加入来解决这个问题,但只是不知道该怎么做。
>>> pd.DataFrame( np.hstack( [arr,-1*arr] ) )

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