pandas使用另一个

时间:2018-05-01 18:26:21

标签: python pandas numpy dataframe conditional

我有一个清单;

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

但是,我不明白其他方法有什么问题。我在这里缺少什么吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试对np.signsumabs进行分组:

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