我的数据框的格式为:
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
自动确定
如何以一种简洁的方式来完成?
答案 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_values
与DataFrame.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