使用 Python 中多列上的重复项计数重塑 Pandas 数据框

林恩

我有一个数据集 df,我想在其中从宽到长重塑,更改列名并为空数字单元格添加 0。

这是考虑到在每个计r_hir_hey等等。

在所需的输出中r_type有 6 行,因为:r_hi(2) 和r_hey(4) 等于 6。然后我们将d_hi, 和并排添加d_hey到单独的列d_typer_type

数据

id  date    r_hi    r_hey   d_hi    d_hey   occupied    remaining
aa  q122    2       4       2       3       10          2
bb  q222    0       1       0       0       2           1

想要的

id  date    r_type  d_type  occupied    remaining
aa  q122    hi      hi      10          2   
aa  q122    hi      hi      10          2   
aa  q122    hey     hey     10          2   
aa  q122    hey     hey     10          2   
aa  q122    hey     hey     10          2   
aa  q122    hey     0       10          2   
bb  q222    hey     0       2           1   

正在做

利用熔化功能:

pd.melt(df, id_vars=['id', 'date'], value_vars=['occupied', 'remaining'])

任何建议表示赞赏

海豆

您可以通过以下步骤进行处理:

df2 = df.set_index(['id', 'date', 'occupied', 'remaining'])

# Split column label to multi-level index for stacking
df2.columns = df2.columns.str.split('_', expand=True)

# Stack level 1 column index 'hi', 'hey' into row index
df3 = df2.stack()

# duplicate 'hi', 'hey' into number of rows 
# according to values in `r_hi`, `r_hey`, `d_hi`, `d_hey`  
df4_d = df3.loc[df3.index.repeat(df3['d'])]
df4_r = df3.loc[df3.index.repeat(df3['r'])]

# transform layouts
df4_da = df4_d.reset_index(level=4)[['level_4']].rename({'level_4': 'd_type'}, axis=1)
df4_ra = df4_r.reset_index(level=4)[['level_4']].rename({'level_4': 'r_type'}, axis=1)

# concat the expanded results of `d_type` and `r_type`
df5 = pd.concat([df4_ra, df4_da])

# Final layout transformation
df_out = (df5.groupby(level=[0, 1, 2, 3])
             .apply(lambda df: df.apply(lambda x: pd.Series(x.dropna().values)))
             .fillna(0)
             .droplevel(4)
         ).reset_index()

结果:

print(df_out)

   id  date  occupied  remaining r_type d_type
0  aa  q122        10          2    hey    hey
1  aa  q122        10          2    hey    hey
2  aa  q122        10          2    hey    hey
3  aa  q122        10          2    hey     hi
4  aa  q122        10          2     hi     hi
5  aa  q122        10          2     hi      0
6  bb  q222         2          1    hey      0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章