Установить значение фрейма данных панд на условном - PullRequest
0 голосов
/ 28 сентября 2018

Я не могу найти похожий вопрос для этого запроса.Тем не менее, у меня есть pandas dataframe, где я хочу использовать два столбца, чтобы сделать их условными, и, если это правда, заменить значения в одном из этих столбцов.

Например.Один из моих столбцов - это «имя элемента», а другой - «значение».«itemname» может повторяться много раз.Я хочу проверить для каждого «itemname», если все другие элементы с таким же именем имеют значение 0, а затем заменить эти «value» на 100.

Я знаю, что это должно быть просто, однако я не могу понятьвокруг него.

Просто чтобы прояснить это, здесь

    itemname value
0      a       0
1      b       100
2      c       0
3      a       0
3      b       75
3      c       90

Я бы хотел, чтобы мое заявление изменило этот фрейм данных на

    itemname value
0      a       100
1      b       100
2      c       0
3      a       100
3      b       75
3      c       90

Надеюсь, что это имеет смысл.Я проверяю, спрашивал ли кто-то еще что-то подобное и не мог найти что-то в этом случае.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Использование transform с any:

df.loc[~df.groupby('itemname').value.transform('any'), 'value'] = 100

Использование numpy.where:

s = ~df.groupby('itemname').value.transform('any')
df.assign(value=np.where(s, 100, df.value))

Использование сложения и умножения:

s = ~df.groupby('itemname').value.transform('any')
df.assign(value=df.value + (100 * s))

Обавыведите правильный вывод, однако, np.where, и окончательное решение не изменяет DataFrame на месте:

  itemname  value
0        a    100
1        b    100
2        c      0
3        a    100
3        b     75
3        c     90

Объяснение

~df.groupby('itemname').value.transform('any')

0     True
1    False
2    False
3     True
3    False
3    False
Name: value, dtype: bool

Так как 0 является ошибочным значением, мы можем использовать any и отрицать результат, чтобы найти группы, в которых все значенияравно 0.

0 голосов
/ 28 сентября 2018

Если все ваши значения положительные или 0

Можно использовать преобразование с суммой и проверить, если 0:

m = (df.groupby('itemname').transform('sum') == 0)['value']
df.loc[m, 'value'] = 100
0 голосов
/ 28 сентября 2018

Вы можете использовать GroupBy + transform для создания маски.Затем присвойте через pd.DataFrame.loc и логическое индексирование:

mask = df.groupby('itemname')['value'].transform(lambda x: x.eq(0).all())
df.loc[mask.astype(bool), 'value'] = 100

print(df)

  itemname  value
0        a    100
1        b    100
2        c      0
3        a    100
3        b     75
3        c     90
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...