Заполнение других столбцов в кадре данных на основе имен столбцов, присутствующих в одном столбце - PullRequest
2 голосов
/ 10 июля 2019

У меня есть фрейм данных с ~ 300 столбцами, имеющими столбцы от «Prod1» до «Prod300», как показано ниже:

ID   Product Prod1 Prod2 Prod3 Prod4 Prod5 Prod6 Prod7
01     1      0     0     0     0     0     0     0
01     2      0     0     0     0     0     0     0
01     3      0     0     0     0     0     0     0
02     1      0     0     0     0     0     0     0
02     4      0     0     0     0     0     0     0
03     3      0     0     0     0     0     0     0
04     6      0     0     0     0     0     0     0

То, что я хочу, это просто заполнить соответствующий столбец «Prod» в соответствии со значением в столбце «Product», т. Е. Ниже df как Output -

ID   Product Prod1 Prod2 Prod3 Prod4 Prod5 Prod6 Prod7
01     1      1     0     0     0     0     0     0
01     2      0     1     0     0     0     0     0
01     3      0     0     1     0     0     0     0
02     1      1     0     0     0     0     0     0
02     4      0     0     0     1     0     0     0
03     3      0     0     1     0     0     0     0
04     6      0     0     0     0     0     1     0

Дело в том, что я знаю, что у меня всего 300 продуктов, но я не могу получить все значения в столбце «Продукт», и я хочу сохранить столбец «Prod7», даже если его нет в « Столбец продукта и имеет все значения = 0. Итак, я не могу использовать pivot_table ...

Я попытался перебрать столбец «Продукт», как показано ниже:

for row in range ( len( df['Product'])) :
   df['Prod' + str( df['Product'][row] ) ][row] = 1

То, что я делаю выше, - это просмотр значений в столбце «Продукт» одно за другим, а затем заполнение 1 в соответствующем столбце и той же строке.

Кроме того, поскольку существует 300 столбцов от Prod1 до Prod300, я бы не хотел делать это столбец за столбцом, как показано ниже:

df['Prod1'] = np.where(df['Product'] == 1, 1 , 0)
df['Prod2'] = np.where(df['Product'] == 2, 1 , 0)
df['Prod3'] = np.where(df['Product'] == 3, 1 , 0)
........
........

Теперь приведенные выше коды работают, но я знаю, что вы не должны использовать циклы, поскольку они медленные.

Может быть, потому что я новичок в python, и это действительно просто, но любая альтернатива будет высоко ценится. Я также обеспокоен временем выполнения кода, поэтому все, что быстрее, чем раньше, будет очень полезным ...

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Пустые столбцы здесь не нужны.

Используйте get_dummies для новых столбцов индикатора, добавьте DataFrame.reindex для добавления несуществующих столбцов на range и последний DataFrame.add_prefix:

df1 = (pd.get_dummies(df['Product'])
         .reindex(range(1, 8), axis=1, fill_value=0)
         .add_prefix('Prod'))
print (df1)
   Prod1  Prod2  Prod3  Prod4  Prod5  Prod6  Prod7
0      1      0      0      0      0      0      0
1      0      1      0      0      0      0      0
2      0      0      1      0      0      0      0
3      1      0      0      0      0      0      0
4      0      0      0      1      0      0      0
5      0      0      1      0      0      0      0
6      0      0      0      0      0      1      0

И тогда можно использовать DataFrame.join с первыми 2 столбцами оригинала DataFrame:

df2 = df.iloc[:, :2].join(df1)
print (df2)
   ID  Product  Prod1  Prod2  Prod3  Prod4  Prod5  Prod6  Prod7
0   1        1      1      0      0      0      0      0      0
1   1        2      0      1      0      0      0      0      0
2   1        3      0      0      1      0      0      0      0
3   2        1      1      0      0      0      0      0      0
4   2        4      0      0      0      1      0      0      0
5   3        3      0      0      1      0      0      0      0
6   4        6      0      0      0      0      0      1      0
0 голосов
/ 10 июля 2019

вы можете сделать:

df.iloc[range(df.shape[0]),df['Product']] = 1

, если ID является столбцом, а не индексом, вы должны сделать:

df.iloc[range(df.shape[0]),df['Product']+1] = 1

, например:

df = pd.DataFrame({'Product':[1, 3, 2, 3,4]})
df['prod1'] = df['prod2'] = df['prod3'] = df['prod4'] = 0
df.iloc[range(df.shape[0]),df['Product']] = 1
df
>>
Product prod1   prod2   prod3   prod4
0   1   1   0   0   0
1   3   0   0   1   0
2   2   0   1   0   0
3   3   0   0   1   0
4   4   0   0   0   1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...