仅转换选定的列以使用 melt 和 pivot 进行转置?
Converting only selected columns to transpose using melt and pivot?
我有这样的数据框:
id Gender TV Radio
0 M Daily Daily
1 F Monthly Weekly
2 M Weekly Weekly
3 F Daily Daily
我需要将列更改为值并将值更改为列,这是我的期望输出。
id Gender Daily Monthly Weekly
0 M TV NaN NaN
0 M Radio NaN NaN
1 F NaN TV Weekly
2 M NaN NaN TV
2 M NaN NaN Radio
3 F TV NaN NaN
3 F Radio NaN NaN
我正在使用 melt+pivot 但我丢失了信息。这是我正在使用的。
idx = ['id', 'Gender']
m = df.melt(idx).pivot_table(index=idx,columns='value',values='variable',aggfunc='first')
out = m.reset_index(idx).rename_axis(index=None,columns=None)
但我只得到第一个值。例如,如果电视和广播每天都发生,那么我只得到第一个值。我知道我只是先聚合但不知道我可以使用哪个函数来获取所有值。
id Gender Daily Monthly Weekly
0 M TV NaN NaN
1 F NaN TV Weekly
2 M NaN NaN TV
3 F TV NaN NaN
使用DataFrame.melt
with GroupBy.cumcount
for counter by duplicated values and then Series.unstack
进行整形:
idx = ['id', 'Gender']
m = df.melt(idx)
m['g'] = m.groupby(idx).cumcount()
m = m.set_index(idx + ['g', 'value'])['variable'].unstack()
out = m.reset_index(idx).rename_axis(index=None,columns=None)
print (out)
id Gender Daily Monthly Weekly
0 0 M TV NaN NaN
1 0 M Radio NaN NaN
0 1 F NaN TV NaN
1 1 F NaN NaN Radio
0 2 M NaN NaN TV
1 2 M NaN NaN Radio
0 3 F TV NaN NaN
1 3 F Radio NaN NaN
我有这样的数据框:
id Gender TV Radio
0 M Daily Daily
1 F Monthly Weekly
2 M Weekly Weekly
3 F Daily Daily
我需要将列更改为值并将值更改为列,这是我的期望输出。
id Gender Daily Monthly Weekly
0 M TV NaN NaN
0 M Radio NaN NaN
1 F NaN TV Weekly
2 M NaN NaN TV
2 M NaN NaN Radio
3 F TV NaN NaN
3 F Radio NaN NaN
我正在使用 melt+pivot 但我丢失了信息。这是我正在使用的。
idx = ['id', 'Gender']
m = df.melt(idx).pivot_table(index=idx,columns='value',values='variable',aggfunc='first')
out = m.reset_index(idx).rename_axis(index=None,columns=None)
但我只得到第一个值。例如,如果电视和广播每天都发生,那么我只得到第一个值。我知道我只是先聚合但不知道我可以使用哪个函数来获取所有值。
id Gender Daily Monthly Weekly
0 M TV NaN NaN
1 F NaN TV Weekly
2 M NaN NaN TV
3 F TV NaN NaN
使用DataFrame.melt
with GroupBy.cumcount
for counter by duplicated values and then Series.unstack
进行整形:
idx = ['id', 'Gender']
m = df.melt(idx)
m['g'] = m.groupby(idx).cumcount()
m = m.set_index(idx + ['g', 'value'])['variable'].unstack()
out = m.reset_index(idx).rename_axis(index=None,columns=None)
print (out)
id Gender Daily Monthly Weekly
0 0 M TV NaN NaN
1 0 M Radio NaN NaN
0 1 F NaN TV NaN
1 1 F NaN NaN Radio
0 2 M NaN NaN TV
1 2 M NaN NaN Radio
0 3 F TV NaN NaN
1 3 F Radio NaN NaN