Заменить в двоичных столбцах значениями из другого столбца - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть фрейм данных, который выглядит следующим образом:

df = pd.DataFrame({"value": [4, 5, 3], "item1": [0, 1, 0], "item2": [1, 0, 0], "item3": [0, 0, 1]})
df

  value item1   item2   item3
0   4   0      1         0
1   5   1      0         0
2   3   0      0         1

В основном я хочу заменить значение одного элемента с горячим кодированием значением из столбца «value», а затем удалитьстолбец «значение».Результирующий кадр данных должен выглядеть следующим образом:

df_out = pd.DataFrame({"item1": [0, 5, 0], "item2": [4, 0, 0], "item3": [0, 0, 3]})

   item1    item2   item3
0   0        4      0
1   5        0      0
2   0        0      3

Ответы [ 4 ]

0 голосов
/ 16 января 2019

pd.DataFrame.mul

Вы можете использовать mul или эквивалентно multiply, используя метки или целочисленное позиционное индексирование:

# label-based indexing
res = df.filter(regex='^item').mul(df['value'], axis='index')

# integer positional indexing
res = df.iloc[:, 1:].mul(df.iloc[:, 0], axis='index')

print(res)

#    item1  item2  item3
# 0      0      4      0
# 1      5      0      0
# 2      0      0      3
0 голосов
/ 05 декабря 2018

Вам нужно:

col = ['item1','item2','item3']

for c in col:
    df[c] = df[c] * df['value']

df.drop(['value'],1,inplace=True)
0 голосов
/ 05 декабря 2018

Почему бы просто не умножить?

df.pop('value').values * df

   item1  item2  item3
0      0      5      0
1      4      0      0
2      0      0      3

DataFrame.pop имеет приятный эффект удаления и возврата столбца на месте, так что вы можете сделать это за один шаг.


если в столбцах "item_ *" есть что-то кроме 1, то вы можете умножить на bools:

df.pop('value').values * df.astype(bool)

   item1  item2  item3
0      0      5      0
1      4      0      0
2      0      0      3

Если в вашем DataFrame есть другие столбцы, то сделайте следующее:

df
   value  name  item1  item2  item3
0      4  John      0      1      0
1      5  Mike      1      0      0
2      3  Stan      0      0      1

# cols = df.columns[df.columns.str.startswith('item')]
cols = df.filter(like='item').columns
df[cols] = df.pop('value').values * df[cols]

df
  name  item1  item2  item3
0  John      0      5      0
1  Mike      4      0      0
2  Stan      0      0      3
0 голосов
/ 05 декабря 2018

Вы можете сделать что-то вроде:

df = pd.DataFrame([df['value']*df['item1'],df['value']*df['item2'],df['value']*df['item3']])
df.columns = ['item1','item2','item3']

РЕДАКТИРОВАТЬ : так как этот ответ не будет хорошо масштабироваться до многих столбцов, таких как комментарии @coldspeed, его следует выполнить итерацией цикла:

 cols = ['item1','item2','item3']
 for c in cols:
     df[c] *= df['value']
 df.drop('value',axis=1,inplace=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...