首页 > 解决方案 > 根据索引将大数据帧中的数据除以较小数据帧中的数据

问题描述

我有两个数据框。我想根据日期除以第二个数据框中的特定数据,在第一个数据框中创建一个新列。

import pandas as pd

data1 = {'Count':  {('2020-02-01','Cat', '0'): 10,
                    ('2020-02-01','Dog', '1'): 7,
                    ('2020-02-01','Cat', '2'): 5,

                    ('2020-02-03','Cat', '0'): 3,
                    ('2020-02-03','Cat', '1'): 4,
                    ('2020-02-03','Dog', '2'): 10,

                    ('2020-02-05','Cat', '0'): 1,
                    ('2020-02-05','Dog', '1'): 20,
                    ('2020-02-05','Cat', '2'): 17,

                    ('2020-02-08','Dog', '0'): 13,
                    ('2020-02-08','Dog', '1'): 13,

                    ('2020-02-09','Dog', '2'): 14,
                    ('2020-02-09','Cat', '0'): 30,
                    ('2020-02-09','Dog', '1'): 12,
                    ('2020-02-09','Cat', '2'): 1}}

df1 = pd.DataFrame(data1)
df1.index.names = ['Date', 'Animal', 'Dose'] 

data2 = {'Average':  {('2020-02-01','0'): 1,
                      ('2020-02-03','0'): 5,
                      ('2020-02-05','0'): 3,
                      ('2020-02-08','0'): 31,
                      ('2020-02-09','0'): 14}}

df2 = pd.DataFrame(data2)
df2.index.names = ['Date', 'Dose']

所有日期都存在于两个数据框中。
如何将'Count'列中df1'Average'值除以df2基于的值'Date'

显然df1['Divided'] = df1['Date','Count'].div[df2['Date','Average']行不通,但这是一种想法。

我已经尝试了各种各样的事情,包括转换为字典并尝试映射值,但我无法弄清楚。

我的预期结果如下所示:

data3 = [10/1, 7/1, 5/1, 3/5, 4/5, 10/5, 1/3, 20/3, 17/3, 13/31, 13/31, 14/14, 30/14, 12/14, 1/14]

df1['Divided'] = data3

df1

标签: pythonpandasdataframemulti-index

解决方案


这会起作用:

df1 = df1.reset_index(level=['Animal', 'Dose'])
df2 = df2.reset_index(level=['Dose'])
df1["New_Value"] = df1['Count'].div(df2['Average'])
df1 = df1.reset_index().set_index(['Date', 'Animal', 'Dose'])

输出:

                      Count  New_Value
Date       Animal Dose                  
2020-02-01 Cat    0        10  10.000000
                  2         5   5.000000
           Dog    1         7   7.000000
2020-02-03 Cat    0         3   0.600000
                  1         4   0.800000
           Dog    2        10   2.000000
2020-02-05 Cat    0         1   0.333333
                  2        17   5.666667
           Dog    1        20   6.666667
2020-02-08 Dog    0        13   0.419355
                  1        13   0.419355
2020-02-09 Cat    0        30   2.142857
                  2         1   0.071429
           Dog    1        12   0.857143
                  2        14   1.000000

希望这是您正在寻找的。


推荐阅读