我有一个像这样的数据文件:
col1 col2 col3 targ1 targ3 targ6
a b c 1 2 3
a c d 2 4 9
我用熔体旋转最后三根柱子,结果如下:
pivot_df = (data.melt(id_vars=data.columns.difference(['targ1','targ3','targ6']),var_name='m_val', value_name='value')
.assign(month=lambda d: d['m_val'].astype('str').str.extractall('(\d+)').unstack().fillna('').sum(axis=1).astype(int))
)
col1 col2 col3 m_val value
a b c 1 1
a c d 1 2
a b c 3 2
a c d 3 4
a b c 6 3
a c d 6 9
为什么熔体排序的m_val,我希望结果是这样:
col1 col2 col3 m_val value
a b c 1 1
a c d 3 2
a b c 6 3
a c d 1 2
a b c 3 4
a c d 6 9
如果我试图在ignore_index=False
中使用melt()
,那么我会得到以下错误:
ValueError: Index contains duplicate entries, cannot reshape
发布于 2022-08-15 12:30:24
如果使用ignore_index=False
,则按DataFrame.sort_index
排序索引值并设置默认索引
df = (data.melt(id_vars=data.columns.difference(['targ1','targ3','targ6']),var_name='m_val', value_name='value',ignore_index=False)
.sort_index(ignore_index=True)
.assign(month=lambda d: d['m_val'].astype('str').str.extractall('(\d+)').unstack().fillna('').sum(axis=1).astype(int))
)
print (df)
col1 col2 col3 m_val value month
0 a b c targ1 1 1
1 a b c targ3 2 3
2 a b c targ6 3 6
3 a c d targ1 2 1
4 a c d targ3 4 3
5 a c d targ6 9 6
或者将melt
替代与DataFrame.stack
一起使用
df = (data.set_index(data.columns.difference(['targ1','targ3','targ6']).tolist())
.rename_axis('m_val', axis=1)
.stack()
.reset_index(name='value')
.assign(month=lambda d: d['m_val'].astype('str').str.extractall('(\d+)').unstack().fillna('').sum(axis=1).astype(int)))
print (df)
col1 col2 col3 m_val value month
0 a b c targ1 1 1
1 a b c targ3 2 3
2 a b c targ6 3 6
3 a c d targ1 2 1
4 a c d targ3 4 3
5 a c d targ6 9 6
https://stackoverflow.com/questions/73360974
复制相似问题