Создайте катагорические данные с весом - PullRequest
1 голос
/ 08 ноября 2019

У меня есть DataFrame, как показано ниже:

>>> df=pd.DataFrame(np.array([['user1', 1, 10], ['user1', 2, 25], ['user2', 2, 20], ['user3', 3, 30], ['user4', 3, 50]]), columns=['UserId', 'Dim', 'Count'])
>>> df
  UserId Dim Count
0  user1   1    10
1  user1   2    25
2  user2   2    20
3  user3   3    30
4  user4   3    50

Я хочу использовать Dim столбец в качестве измерения, для этого я делаю:

>>> df_cat = pd.get_dummies(df, columns=['Dim'])
>>> df_cat
  UserId Count  Dim_1  Dim_2  Dim_3
0  user1    10      1      0      0
1  user1    25      0      1      0
2  user2    20      0      1      0
3  user3    30      0      0      1
4  user4    50      0      0      1

Но вместо этого0 или 1, я хочу связать значение в столбце Count как вес, т.е. мой ожидаемый результат должен выглядеть следующим образом:

  UserId Count Dim_1 Dim_2 Dim_3
0  user1    10    10     0     0
1  user1    25     0    25     0
2  user2    20     0    20     0
3  user3    30     0     0    30
4  user4    50     0     0    50

В настоящее время я достигаю этого, используя for loop:

for i, row in df_cat.iterrows():
    for col in df_cat.columns:
        if(row[col] == 1):
            df_cat.loc[i, col]=df_cat.Count[i]

Дайте мне знать, если есть лучший способ сделать это вместоиспользование 2 for циклов, так как цикл занимает много времени, поскольку фактический набор данных огромен.

1 Ответ

1 голос
/ 08 ноября 2019

Используйте pivot для изменения формы и добавьте к оригиналу с помощью DataFrame.join:

df1 = df.pivot(columns='Dim', values='Count').fillna(0).add_prefix('Dim_')
df_cat = df[['UserId','Count']].join(df1)
print (df_cat)
  UserId Count Dim_1 Dim_2 Dim_3
0  user1    10    10     0     0
1  user1    25     0    25     0
2  user2    20     0    20     0
3  user3    30     0     0    30
4  user4    50     0     0    50

Ваше решение следует изменить, выбрав только добавленные столбцы сstr.startswith и кратно столбцу Count, но необходимо привести к целым числам:

df_cat = pd.get_dummies(df, columns=['Dim'])

c = df_cat.columns.str.startswith('Dim')
df_cat.loc[:, c] = df_cat.loc[:, c].mul(df['Count'].astype('int'), axis=0)
print (df_cat)
  UserId Count  Dim_1  Dim_2  Dim_3
0  user1    10     10      0      0
1  user1    25      0     25      0
2  user2    20      0     20      0
3  user3    30      0      0     30
4  user4    50      0      0     50

df_cat = pd.get_dummies(df, columns=['Dim'])

c = df_cat.columns.str.startswith('Dim')

df_cat.loc[:, c] = df_cat.loc[:, c] * df['Count'].values.astype(np.int)[:, None]
print (df_cat)
  UserId Count  Dim_1  Dim_2  Dim_3
0  user1    10     10      0      0
1  user1    25      0     25      0
2  user2    20      0     20      0
3  user3    30      0      0     30
4  user4    50      0      0     50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...