简体   繁体   English

仅使用熔化和 pivot 将选定的列转换为转置?

[英]Converting only selected columns to transpose using melt and pivot?

I have dataframe like this:我有这样的 dataframe :

id  Gender        TV        Radio
0   M            Daily      Daily
1   F            Monthly    Weekly
2   M            Weekly     Weekly
3   F            Daily      Daily

I need to change the columns into values and values into column, This is my desired output .我需要将列更改为值,将值更改为列,这是我想要的 output

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

I am using melt+pivot but i lose information.我正在使用melt+pivot,但我丢失了信息。 Here is what i am using.这是我正在使用的。

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)

But i am getting only the first value.但我只得到第一个值。 For example if the daily occur for tv and radio then i am geting only the first value.. I know i am aggregating only first but dont know which function i can use to get all the values.例如,如果电视和收音机每天都发生,那么我只得到第一个值。我知道我只是先聚合但不知道我可以使用哪个 function 来获取所有值。

 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

Use DataFrame.melt with GroupBy.cumcount for counter by duplicated values and then Series.unstack for reshape:使用DataFrame.meltGroupBy.cumcount通过重复值进行计数器,然后使用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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM