Pandas условно создает новый фрейм данных с использованием другого

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

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

Однако я не понимаю, что не так с другими подходами. Что-то мне здесь не хватает?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать сгруппировать по 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. Это полезно. Я также опубликовал решение выше. Я специально пытаюсь понять, что не так с моими первыми двумя подходами.

dayum 01.05.2018 20:32

Другие вопросы по теме