我有一个清单;
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"
所以基本上我试图创建一个像raw一样的空数据帧,然后有条件地填充它。但是,上述方法失败了。
即使我尝试创建一个新的coolumn而不是新的df,它也会失败:
raw.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
但是,我不明白其他方法有什么问题。我在这里缺少什么吗?
答案 0 :(得分:1)
您可以尝试对np.sign
,sum
和abs
进行分组:
s = pd.Series(orig)
s.groupby(np.sign(s)).transform('sum').abs().tolist()
输出:
[9, 9, 9, 18, 18, 18]
您没有对齐索引。 &#39; sum_pos&#39;是一个包含单个元素的系列,其索引为&#39; raw&#39;。并且,您试图将该系列分配给没有“原始”数据帧的部分数据帧。作为索引。
Pandas几乎使用索引对齐来完成所有事情。要正确执行此操作,您需要从sum_pos系列中提取值:
final.loc[raw['raw'] > 0, 'final'] = sum_pos.values
print(final)
输出:
final
0 9.0
1 9.0
2 9.0
3 NaN
4 NaN
5 NaN