#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
У меня есть фрейм данных pandas df
с двумя столбцами ‘a’ и ‘b’.
У меня есть еще одна серия pandas, которая состоит из значений ‘b’. Индексом этой серии являются a
значения из df
.
Важно отметить, что размер ряда НЕ совпадает с размером фрейма данных. В нем всего около половины количества строк.
То, что я хочу сделать, это просто заменить b
-values в df
, если это значение меньше соответствующего b
-value в серии pandas.
Я перепробовал так много вещей, но продолжаю сталкиваться с ошибками.
Например, если фрейм данных имеет df = pd.DataFrame({‘a’: [1,2,3,4], ‘b’: [1,2,3,4]})
a b
0 1 1
1 2 2
2 3 3
3 4 4
и серия pandas имеет data = {1: 0.5, 4: 5}
, тогда обновленный фрейм данных должен иметь
a b
0 1 1
1 2 2
2 3 3
3 4 5
Как вы можете видеть, обновилось только значение с индексом 4
, поскольку 5 > 4
.
Комментарии:
1. Почему бы вам не добавить некоторые образцы данных, чтобы мы могли попробовать сами.
2. Готово! Я не знаю, как правильно его отформатировать.
Ответ №1:
Вы можете сделать это следующим образом, используя свой пример Series и DataFrame:
import pandas as pd
sr = pd.Series({1: 0.5, 4: 5})
df = pd.DataFrame({'a': [1, 2, 3, 4], 'b': [1, 2, 3, 4]})
df['b'] = df.apply(lambda row: sr[row['a']] if (row['a'] in sr.index) and (row['b'] < sr[row['a']]) else row['b'], axis=1)
Это работает путем применения анонимной функции (определенной оператором lambda) к каждой строке вашего фрейма данных и проверки, существует ли значение a этой строки в индексе ряда и больше ли значение b в ряду, чем в этой строке фрейма данных. На этой основе он выбирает, брать ли значение из ряда или сохранять то, что уже есть в DataFrame.
Ошибка ключа, которая обычно возникает при попытке поиска значения в ряду для индекса, который не существует, можно избежать, поместив (row['a'] in sr.index)
оператор первым в условие if. Поскольку вторая часть условия после the and
вычисляется только в том случае, если первая часть вычисляется True
как , ключевая ошибка в таких случаях исключается.
Редактировать:
Поскольку лямбда-функция является трудночитаемой, вы также можете сделать это более подробно, определив свою функцию явно:
def comparison(row):
if (row['a'] in sr.index) and (row['b'] < sr[row['a']]):
return sr[row['a']]
else:
return row['b']
df['b'] = df.apply(lambda row: comparison(row), axis=1)