首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫:你是如何把字典的字典排成两栏的?

熊猫:你是如何把字典的字典排成两栏的?
EN

Stack Overflow用户
提问于 2021-06-15 15:26:20
回答 4查看 470关注 0票数 4

我有以下字典:

代码语言:javascript
复制
rates = {'USD': 
              {'2019': 1,
               '2020': 2,
               '2021': 3},
         'CAD':
              {'2019': 4,
               '2020': 5,
               '2021': 6}
         }

我有以下虚拟数据:

代码语言:javascript
复制
   Item Currency Year Rate
0  1    USD      2019 
1  2    USD      2020
2  3    CAD      2021
3  4    CAD      2019
4  5    GBP      2020

现在,我希望通过映射正确的速率( rate = f(currency,year) )来填充列rate = f(currency,year)。我试着:

代码语言:javascript
复制
def map_rate(data, rates):

    for index, row in data.iterrows():

        currency = str(row['Currency'])

        if currency in list(rates.keys()):

            year = str(row['Year'])
            rate = rates[currency][year]

        else:
            rate = 1

    return rate

我使用上述内容如下:

代码语言:javascript
复制
df['Rate'] = map_rate(test, rates)

然而,这只是返回第一个比率,例如值1,而不是适当的费率:

代码语言:javascript
复制
    Item Currency Year  Rate
0   1    USD      2019  1
1   2    USD      2020  1
2   3    CAD      2021  1
3   4    CAD      2019  1
4   5    GBP      2020  1

预期结果是:

代码语言:javascript
复制
    Item Currency Year  Rate
0   1    USD      2019  1
1   2    USD      2020  2
2   3    CAD      2021  6
3   4    CAD      2019  4
4   5    GBP      2020  1

我的错误在哪里?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-06-15 15:46:21

这里有一种方法,使用stack创建一个多索引系列,您可以使用df的值来reindex,以获得每行想要的费率。

代码语言:javascript
复制
df['rate'] = (
    pd.DataFrame(rates)
      .stack()
      .reindex(pd.MultiIndex.from_frame(df[['Year','Currency']].astype(str)), 
               fill_value=1)
     .to_numpy()
)
print(df)
   Item Currency  Year  rate
0     1      USD  2019     1
1     2      USD  2020     2
2     3      CAD  2021     6
3     4      CAD  2019     4
4     5      GBP  2020     1
票数 2
EN

Stack Overflow用户

发布于 2021-06-15 15:33:17

使用.apply

Ex:

代码语言:javascript
复制
df['Rate'] = df.apply(lambda x: rates[x['Currency']][x['Year']], axis=1)
# OR
df['Rate'] = df.apply(lambda x: rates.get(x['Currency'], dict()).get(x['Year'], 1), axis=1)
print(df)

输出:

代码语言:javascript
复制
  Item Currency  Year  Rate
0    1      USD  2019     1
1    2      USD  2020     2
2    3      CAD  2021     6
3    4      CAD  2019     4
4    5      GBP  2020     1
票数 3
EN

Stack Overflow用户

发布于 2021-06-15 15:54:27

为费率创建另一个数据格式

代码语言:javascript
复制
rates_df = pd.DataFrame(rates).unstack().reset_index()
rates_df.columns = ['Currency', 'Year', 'Rates']
rates_df['Year'] = rates_df['Year'].astype(int)

然后合并

代码语言:javascript
复制
df.merge(rates_df, on=['Currency', 'Year'], how='left').fillna(1)

基准利率

代码语言:javascript
复制
  Currency  Year  Rates
0      USD  2019      1
1      USD  2020      2
2      USD  2021      3
3      CAD  2019      4
4      CAD  2020      5
5      CAD  2021      6

输出

代码语言:javascript
复制
   Item Currency  Year  Rates
0     1      USD  2019    1.0
1     2      USD  2020    2.0
2     3      CAD  2021    6.0
3     4      CAD  2019    4.0
4     5      GBP  2020    1.0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67989170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档