以宽格式制作 pandas df 并将值取消连接到不同的列

我在标题中解释问题时有点麻烦


偶然地,我们将 Pandas 数据框转向了这个:


df = pd.DataFrame(np.array([[1,1,2], [1,2,1], [2,1,2], [2,2,2],[3,1,3]]),columns=['id', '3s', 'score'])


id   3s  score

1    1   2

1    2   1

2    1   2             

2    2   2                 

3    1   3

但是我们需要取消堆叠,所以 df 看起来像这样(原始版本): '3s' 列 'unpivots' 到由 3 个具有 0 和 1 的有序列按顺序相加的离散集。因此,如果我们有'3s'= 2相应的列(第二组 3s)中'score'= 2的值将是(按顺序排列 3 个中的 2 个)[1,1,0]['4','5','6']id


df2 = pd.DataFrame(np.array([[1,1,1,0,1,0,0], [2,1,1,0,1,1,0], [3,1,1,1,np.nan,np.nan,np.nan] ]),columns=['id', '1', '2','3','4','5','6'])


id   1   2   3   4   5   6

1    1   1   0   1   0   0

2    1   1   0   1   1   0      

3    1   1   1 

非常感谢任何帮助! (请救救我)


三国纷争
浏览 129回答 2
2回答

HUWWW

利用:n = 3df2 = df.reindex(index = df.index.repeat(n))new_df = (df2.assign(score = df2['score'].gt(df2.groupby(['id','3s'])                                                .id                                                .cumcount())                                         .astype(int),                     columns = df2.groupby('id').cumcount().add(1))             .pivot_table(index = 'id',                          values='score',                          columns = 'columns',                          fill_value = '')             .rename_axis(columns = None)             .reset_index())print(new_df)输出   id    1    2    3  4  5  60   1  1.0  1.0  0.0  1  0  01   2  1.0  1.0  0.0  1  1  02   3  1.0  1.0  1.0         如果你愿意,你可以使用fill_value = 0   id  1  2  3  4  5  60   1  1  1  0  1  0  01   2  1  1  0  1  1  02   3  1  1  1  0  0  0

墨色风雨

这应该可以解决问题:for gr in df.groupby('3s').groups:    for i in range(1,4):        df[str(i+(gr-1)*3)]=np.where((df['3s'].eq(gr))&(df['score'].ge(i)), 1,0)df=df.drop(['3s', 'score'], axis=1).groupby('id').max().reset_index()输出:   id  1  2  3  4  5  60   1  1  1  0  1  0  01   2  1  1  0  1  1  02   3  1  1  1  0  0  0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python