如何根据多索引数据帧中的行索引值创建列?

2024-09-24 02:20:11 发布

您现在位置:Python中文网/ 问答频道 /正文

假设您有以下数据帧:

ridx = pd.MultiIndex.from_tuples([('Tom','apple'),('Tom','banana'),('Anna','banana'),('Anna','citrus')], names=['basket', 'fruit']) 
df = pd.DataFrame({'Quantity' : [1, 2, 3, 4]}, index=ridx)
df

df

你有一本字典可以告诉你每个水果含多少糖:

sugar_content = {'apple':3,'banana':10,'citrus':2}

如何向dataframe添加一个新列,其中包含“水果”索引中指定的水果的糖含量?你知道吗


Tags: 数据fromappledfnamespdbananatom
2条回答

更快的方法:

In [58]: df['sugar_content'] = df.reset_index()['fruit'].map(sugar_content).to_frame().set_index(df.index)

In [59]: df
Out[59]:
               Quantity  sugar_content
basket fruit
Tom    apple          1              3
       banana         2             10
Anna   banana         3             10
       citrus         4              2

说明:

In [60]: df.reset_index()['fruit'].map(sugar_content)
Out[60]:
0     3
1    10
2    10
3     2
Name: fruit, dtype: int64

In [61]: df.reset_index()['fruit'].map(sugar_content).to_frame()
Out[61]:
   fruit
0      3
1     10
2     10
3      2

In [62]: df.reset_index()['fruit'].map(sugar_content).to_frame().set_index(df.index)
Out[62]:
               fruit
basket fruit
Tom    apple       3
       banana     10
Anna   banana     10
       citrus      2

您可以使用df.index.get_level_values()检索索引值数组,然后在字典的get方法上使用np.vectorize()来执行映射:

fruits  = df.index.get_level_values('fruit').values
fruits_sugar = np.vectorize(sugar_content.get)(fruits) # vectorize the get method of the dictionary and pass the sugar_content ndarray
df['sugar per fruit'] = fruits_sugar
df

dataframe

相关问题 更多 >