我有一个数据集 df,我想在其中从宽到长重塑,更改列名并为空数字单元格添加 0。
这是考虑到在每个计r_hi
,r_hey
等等。
在所需的输出中r_type
有 6 行,因为:r_hi
(2) 和r_hey
(4) 等于 6。然后我们将d_hi
, 和并排添加d_hey
到单独的列d_type
上r_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] 删除。
我来说两句