我有这个数据框:

user     day
A        1
A        4
B        2
B        4


我想将数据框更改为此:

user   day_1   day_2   day_3   day_4
A      1       0       0       1
B      0       1       0       1


因此,即使在day_3上没有用户,它也会自动生成day_3

我已经尝试过使用此代码,但是它不起作用

for index, row in grouped_user.iterrows():
    grouped_user["day_" + str(int(row.active_period))] = 1

最佳答案

使用get_dummies转换为字符串并聚合max

df1 = pd.get_dummies(df.astype(str), columns=['day']).groupby('user', as_index=False).max()
print (df1)
  user  day_1  day_2  day_4
0    A      1      0      1
1    B      0      1      1


如有必要,添加缺少的天数将user转换为索引,将get_dummiesDataFrame.reindex一起用于将所有可能的天数添加到列中:

days = [f'day_{x}' for x in range(df['day'].min(), df['day'].max() + 1)]
df1 = (pd.get_dummies(df.set_index('user').astype(str))
         .max(level=0)
         .reindex(columns=days, fill_value=0)
         .reset_index())
print (df1)
  user  day_1  day_2  day_3  day_4
0    A      1      0      0      1
1    B      0      1      0      1


crosstabDataFrame.clip的另一种解决方案:

df1 = (pd.crosstab(df['user'], df['day'])
         .clip(upper=1)
         .reindex(range(df['day'].min(), df['day'].max()+1), fill_value=0, axis=1)
         .add_prefix('day_')
         .rename_axis(None, axis=1)
         .reset_index())
print (df1)
  user  day_1  day_2  day_3  day_4
0    A      1      0      0      1
1    B      0      1      0      1

关于python - Pandas 每天新专栏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58796921/

10-15 22:56