微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – Pandas – 创建类似于pd.get_dummies的多个列

假设我的数据如下所示:

df = pd.DataFrame({'color': ['red','blue','green','red','blue'],'line': ['sunday','sunday','monday','tuesday'],'group': ['1','1','2','1'],'value': ['a','b','a','c','b']})

    color   group   line    value
0   red       1     sunday   a
1   blue      1     sunday   b
2   green     2     monday   a
3   red       1     monday   c
4   blue      1     monday   a
5   blue      1    tuesday   b

基本上,我想要的是获得每种颜色的行列表.例如,我希望颜色为红色,以在其自己的列中显示与其关联的每一行和值.诀窍是我还想显示与同一组颜色相关的其他线条.这些的相应值将是“不符合条件”.因此我希望我的输出看起来像这样:

color   line_1  line_1_value    line_2  line_2_value    line_3     line_3_value
0   red     sunday       a          monday       c          tuesday    not eligible
1   blue    sunday       b          monday       a          tuesday         b
2   green   monday       c

我需要做大约50,000种独特的“颜色”.我确信这是相对简单的事情,但我还没有掌握所需的知识或技能.任何帮助,将不胜感激!

解决方法

删除不需要的列并添加一列以获得每种颜色的唯一子索引:

df = df.drop('group',axis=1)
df['index_by_color'] = df.groupby('color').cumcount()

   color     line value  index_by_color
0    red   sunday     a               0
1   blue   sunday     b               0
2  green   monday     a               0
3    red   monday     c               1
4   blue   monday     a               1
5   blue  tuesday     b               2

使用pivot_table获取所需数据的方向:

df.pivot_table(index='color',columns=['index_by_color'],aggfunc=lambda x:x.iloc[0])

                  line                  value
index_by_color       0       1        2     0     1     2
color
blue            sunday  monday  tuesday     b     a     b
green           monday    None     None     a  None  None
red             sunday  monday     None     a     c  None

关于aggfunc = lambda x:x.iloc [0]的事情是将非数字轮转数据减少为特定值,并且子帧的第一个元素足够根据数据结构的单一性.

对列分层索引重新排序:

res = res.sort_index(axis=1,level=1)

                  line value    line value     line value
index_by_color       0     0       1     1        2     2
color
blue            sunday     b  monday     a  tuesday     b
green           monday     a    None  None     None  None
red             sunday     a  monday     c     None  None

其余的部分是微不足道的清理,具体取决于你需要的确切的表示,如cumcount()1,如果你需要开始编号为1而不是0,写入/展平列名称,你想要res.columns = [‘_’.join ([l0,str(l1)])对于l0,在res.columns中为l1]或等价物等.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐