LizzAlice:
私は、フォームのデータフレームを持っています:
basket fruit_apple fruit_pear fruit_cherry
basket_id_1 5 NaN 6
basket_id_2 NaN 1 NaN
そして私は次のようになります。二つの新しい列を作成します:
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
fruit_typeの内容はと自動的に決定されている場合colname.split('_')[1]
どのようにこれは簡潔な方法で行うことができますか?
エズレル:
私は速い変更の列名は、(値の数が少ないので)新しい列をinstedので、私は使用を示唆していると思うrename
との最初のステップとリシェイプでDataFrame.melt
で、最後の変更のためにDataFrame.sort_values
:
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.set_index
とDataFrame.stack
。
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