У меня есть список;
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, а затем условно заполнить его. Однако вышеуказанный метод не работает.
Даже когда я пытаюсь создать новый столбец вместо нового 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
Однако я не понимаю, что не так с другими подходами. Что-то мне здесь не хватает?
Вы можете попробовать сгруппировать по np.sign
, затем по sum
и abs
:
s = pd.Series(orig)
s.groupby(np.sign(s)).transform('sum').abs().tolist()
Выход:
[9, 9, 9, 18, 18, 18]
Вы не выравниваете индексы. sum_pos - это серия с одним элементом, имеющим индекс raw. И вы пытаетесь назначить эту серию той части фрейма данных, которая не имеет «сырого» в качестве индекса.
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
Спасибо, @Scott. Это полезно. Я также опубликовал решение выше. Я специально пытаюсь понять, что не так с моими первыми двумя подходами.