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

标签 python pandas pivot unpivot

抱歉,我无法解释标题中的问题

不小心,我们将 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'score'= 2 ,则值将是 [1,1,0] (2 个按顺序排列 3 个)在 ['4','5','6'] 列(第二组 3)中对应 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 

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

最佳答案

用途:

n = 3
df2 = 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  6
0   1  1.0  1.0  0.0  1  0  0
1   2  1.0  1.0  0.0  1  1  0
2   3  1.0  1.0  1.0         

如果您愿意,可以使用fill_value = 0

   id  1  2  3  4  5  6
0   1  1  1  0  1  0  0
1   2  1  1  0  1  1  0
2   3  1  1  1  0  0  0

关于python - 以宽格式制作 pandas df 并将值取消连接到不同的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59865526/

相关文章:

python - 根据包含 N (pandas) 的另一列获取一列月份的前 N ​​个月

python - 来自多个数据框列的分类数据的散点图

python - 有什么方法可以用 PyPy 安装 Pandas 吗?

sql - 行值到列以及列名称到值 bigquery

python - 即使存在缺失数据,如何重组 Pandas 数据框

python - Django,在哪里更新失败的登录尝试以及为什么?

python - Timer_fd python ?有没有等价物

python - 抓取多个页面,保持独立

python - 如何根据python中的公共(public)ID值将2列的垂直pandas表转换为水平表

python zerorpc和多处理问题