Python 使用另一个数据帧有条件地创建新数据帧

Python 使用另一个数据帧有条件地创建新数据帧,python,pandas,numpy,dataframe,conditional-statements,Python,Pandas,Numpy,Dataframe,Conditional Statements,我有一份清单 orig= [2, 3, 4, -5, -6, -7] 我想创建另一个,其中与上面的正值对应的条目是正值之和,而与上面的负值对应的条目是负值之和。因此,期望的输出是: final = [9, 9, 9, 18, 18, 18] 我正在这样做: raw = pd.DataFrame(orig, columns =['raw']) raw raw 0 2 1 3 2 4 3 -5 4 -6 5 -7 sum_pos = raw[raw>

我有一份清单

orig= [2, 3, 4, -5, -6, -7]
我想创建另一个,其中与上面的正值对应的条目是正值之和,而与上面的负值对应的条目是负值之和。因此,期望的输出是:

final = [9, 9, 9, 18, 18, 18]
我正在这样做:

raw = pd.DataFrame(orig, columns =['raw'])
raw
   raw
0    2
1    3
2    4
3   -5
4   -6
5   -7

sum_pos = raw[raw> 0].sum()
sum_neg = -1*raw[raw < 0].sum()

final = pd.DataFrame(index = raw.index, columns = ['final'])

final
  final
0   NaN
1   NaN
2   NaN
3   NaN
4   NaN
5   NaN

final.loc[raw >0, 'final'] = sum_pos
KeyError: "[('r', 'a', 'w') ('r', 'a', 'w') ('r', 'a', 'w') ('r', 'a', 'w')\n ('r', 'a', 'w') ('r', 'a', 'w')] not in index"
到目前为止,我找到的最佳解决方案是:

pd.DataFrame(np.where(raw>0, sum_pos, sum_neg), index= raw.index, columns=['final'])
   final
0    9.0
1    9.0
2    9.0
3   18.0
4   18.0
5   18.0

然而,我不明白其他方法有什么问题。这里有我遗漏的东西吗?

您可以尝试在
np.sign
上分组,然后在
sum
abs
上分组:

s = pd.Series(orig)
s.groupby(np.sign(s)).transform('sum').abs().tolist()
输出:

[9, 9, 9, 18, 18, 18]
   final
0    9.0
1    9.0
2    9.0
3    NaN
4    NaN
5    NaN
您没有对齐索引。”sum_pos’是一个包含单个元素的序列,该元素的索引为‘raw’。并且,您正试图将该系列分配给数据帧中没有“raw”作为索引的部分

熊猫几乎所有的事情都使用索引对齐。要正确执行此操作,您需要从sum_pos系列中提取值:

final.loc[raw['raw'] > 0, 'final'] = sum_pos.values

print(final)
输出:

[9, 9, 9, 18, 18, 18]
   final
0    9.0
1    9.0
2    9.0
3    NaN
4    NaN
5    NaN

谢谢@Scott。这很有帮助。我也在上面发布了一个解决方案。我特别想了解我的前两种方法有什么问题。