pandas 将DataFrame列Map到2个不同的字典

sc4hvdpw  于 2023-05-12  发布在  其他
关注(0)|答案(2)|浏览(104)

根据国家和年龄,提供了一个孩子将获得多少津贴的代码。我可以使用for循环为孩子获得正确的津贴,但我想使用map函数代替。如果没有国家/地区功能,我只能将孩子的年龄值直接Map到1个dict。现在的问题是,我有2个dicts,我想Mapdf['age']。是否有可能只使用map函数而避免for循环来获得正确的余量?

import pandas as pd

d1 = {
    'canada': {
        '0-5': 5,
        '6-8': 8,
        '9-10': 9,
        '11-15': 14,
        '16-18': 24},
    'us': {
        '0-5': 7,
        '6-8': 9,
        '9-10': 10,
        '11-15': 15,
        '16-18': 35}}

df = pd.DataFrame.from_dict({
    'name': ['Askeladd', 'Torkel'],
    'country': ['canada', 'us'],
    'age': ['0-5', '16-18']})

df2 = df.copy()
df2['allowance'] = [0]*2

# Gives right answer
for i in range(len(df2)):
    df2['allowance'].iloc[i] = d1[df2.iloc[i,:].loc['country']][df2.iloc[i,:].loc['age']]

# Gives wrong answer
df['allowance'] = df['age'].map(d1['us'])
t98cgbkg

t98cgbkg1#

你可以从你的字典中创建一个dataframe,然后与原始的合并:

df.merge(pd.DataFrame(d1).stack().rename('allowance'),
         left_on=['age','country'], right_index=True, how='left')
)

输出:

name country    age  allowance
0  Askeladd  canada    0-5          5
1    Torkel      us  16-18         35
6yt4nkrj

6yt4nkrj2#

加入

首先从d1中创建一个Series:

s1 = (pd.DataFrame(d1).rename_axis(index='age', columns='country')
      .unstack().rename('allowance'))
  • 或者更手动的方法:
d1_flat = {(co, age): x for co,a in d1.items() for age,x in a.items()}
s1 = pd.Series(d1_flat, name='allowance').rename_axis(['country', 'age'])

然后加入:

df.join(s1, on=['country', 'age'])
name country    age  allowance
0  Askeladd  canada    0-5          5
1    Torkel      us  16-18         35

相关问题