我有一个这样的熊猫数据框:
PrimitiveBatch
我要使它看起来像这样:
+-------+-----+-----------------+----------------+----------------+
| name | age | favourite_color | favourite_food | favourite_city |
+-------+-----+-----------------+----------------+----------------+
| john | 25 | yellow | apple | munich |
| james | 24 | red | onion | melbourne |
+-------+-----+-----------------+----------------+----------------+
我想采用3个“收藏夹事物”类别,并将其从3列细分为2列。一栏应该是 thing 的名称,另一栏应该是 thing 的值。
在此过程中,表中的行数应乘以favourite_something类别的数目(在本例中为3x),并且名称和年龄之类的常用值应重复。
总的来说,我的数据集每人每行包含3个观察值:喜欢的颜色,食物和城市。我想重塑数据框的形状,以便在任何给定的行中只有一个观察值。
请告诉我此操作在数据处理中叫什么,以及在python和pandas中执行此操作的最简单方法。
答案 0 :(得分:1)
这本质上是一个重塑问题,您可以使用DataFrame.melt
解决。您的数据框具有多个值变量,
new_df = df.melt(id_vars= ['name', 'age'], value_vars=['favourite_color', 'favourite_food', 'favourite_city'], \
var_name='favourite category', value_name='value of favourite category')
new_df['favourite category'] = new_df['favourite category'].replace({'favourite_':''}, regex = True)
name age favourite category value of favourite category
0 john 25 color yellow
1 james 24 color red
2 john 25 food apple
3 james 24 food onion
4 john 25 city munich
5 james 24 city melbourne
答案 1 :(得分:0)
由于您希望重塑(“收藏夹”)的列中有一些共性,因此可以在此处部署pandas的wide to long:只需声明各种参数,然后将其传递给函数:
pd.wide_to_long(df,
stubnames ='favourite',
i=['name','age'],
j='favourite category',
suffix = r'(color|food|city)',
sep='_').rename(columns={'favourite':'value of favourite category'}).reset_index()
name age favourite category value of favourite category
0 john 25 color yellow
1 john 25 food apple
2 john 25 city munich
3 james 24 color red
4 james 24 food onion
5 james 24 city melbourne