панды условно создавая новый фрейм данных, используя другой - PullRequest
0 голосов
/ 01 мая 2018

У меня есть список;

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 голосов
/ 01 мая 2018

Вы можете попробовать группировать по 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». И вы пытаетесь присвоить этот ряд части данных, для которой в качестве индекса не указано «raw».

Панды делают почти все, используя выравнивание по индексу. Чтобы правильно сделать это, вам нужно извлечь значения из ряда 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
...