从pandas df列名称和值创建新列

时间:2020-02-21 09:30:29

标签: python pandas

我的数据框的格式为:

series: [{
    data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
}, {
        linkedTo: ':previous',
    data: [144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4, 29.9, 71.5, 106.4, 129.2]
}]

,我想创建两个新的列,如下所示:

basket            fruit_apple   fruit_pear   fruit_cherry
basket_id_1       5             NaN          6
basket_id_2       NaN           1            NaN

其中,fruit_type的内容由basket fruit_type number basket_id_1 apple 5 basket_id_1 pear NaN basket_id_1 cherry 6 basket_id_2 apple NaN basket_id_2 pear 1 basket_id_2 cherry NaN 自动确定 如何以一种简洁的方式来完成?

2 个答案:

答案 0 :(得分:7)

我认为更改列名称插入新列会更快(因为值数量更少),所以我建议第一步使用rename并用DataFrame.melt重塑,最后更改顺序为{{3} }:

df = (df.rename(columns= lambda x: x.split('_')[-1])
        .melt('basket', var_name='fruit_type', value_name='number')
        .sort_values('basket'))
print (df)
        basket fruit_type  number
0  basket_id_1      apple     5.0
2  basket_id_1       pear     NaN
4  basket_id_1     cherry     6.0
1  basket_id_2      apple     NaN
3  basket_id_2       pear     1.0
5  basket_id_2     cherry     NaN

另一个想法是将DataFrame.sort_valuesDataFrame.set_index结合使用:

df = (df.set_index('basket')
        .rename(columns= lambda x: x.split('_')[-1])
        .rename_axis('fruit_type', axis=1)
        .stack(dropna=False)
        .reset_index(name='number')
        )
print (df)
        basket fruit_type  number
0  basket_id_1      apple     5.0
1  basket_id_1       pear     NaN
2  basket_id_1     cherry     6.0
3  basket_id_2      apple     NaN
4  basket_id_2       pear     1.0
5  basket_id_2     cherry     NaN

答案 1 :(得分:2)

从宽格式转换为长格式,
通过从fruit_type列中删除“ fruit_”来创建新列
并按“购物篮”列进行排序

编辑:感谢@jezrael,他指出了剥离的危险(它将剥离任何字母,这肯定会影响到其他用例的可伸缩性),将其更改为替换,因为它应该更安全。用于正则表达式和分组。

(df.melt(id_vars='basket',
         var_name='fruit_type',
         value_name='number')
   .assign(fruit_type=lambda x: x.fruit_type.str.replace(r'fruit_',''))
   .sort_values('basket')
  )

    basket  fruit_type  number
0   basket_id_1 apple   5.0
2   basket_id_1 pear    NaN
4   basket_id_1 cherry  6.0
1   basket_id_2 apple   NaN
3   basket_id_2 pear    1.0
5   basket_id_2 cherry  NaN