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。这很有帮助。我也在上面发布了一个解决方案。我特别想了解我的前两种方法有什么问题。