繁体   English   中英

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

[英]How to create a column depending on the row index values in a multiindex pandas dataframe?

假设您有以下数据框:

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}

您如何向包含“水果”索引中指定的水果的糖含量的数据框添加新列?

更快的方法来做到这一点:

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()然后使用np.vectorize()上,以执行地图字典的get方法:

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

数据框

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM