如何在 Pandas DataFrame 中 return 所有相反的对?
How to return all opposite pairs in a Pandas DataFrame?
对于下面的数据框,如何return所有相反的对?
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) sum of all rows is 0
(2) as there are 3 "1" and 2 "-1" in
original data, output includes 2 "1" and 2"-1".
a
0 1
1 2
2 -2
4 -1
5 -1
6 1
非常感谢。
好吧,我认为这会减少行数(而且可能会减少),但这确实有效。首先创建几个新列以简化后面的语法:
>>> df1['abs_a'] = np.abs( df1['a'] )
>>> df1['ones'] = 1
那么你需要做的主要事情就是数数。例如,是 1
少还是 -1
少?
>>> 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
对于下面的数据框,如何return所有相反的对?
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) sum of all rows is 0
(2) as there are 3 "1" and 2 "-1" in original data, output includes 2 "1" and 2"-1".
a
0 1
1 2
2 -2
4 -1
5 -1
6 1
非常感谢。
好吧,我认为这会减少行数(而且可能会减少),但这确实有效。首先创建几个新列以简化后面的语法:
>>> df1['abs_a'] = np.abs( df1['a'] )
>>> df1['ones'] = 1
那么你需要做的主要事情就是数数。例如,是 1
少还是 -1
少?
>>> 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