基于索引将较大数据帧中的数据除以较小数据帧中的数据

问题描述 投票:1回答:1

我有两个数据帧。我想通过除以第二个数据框中的特定数据(取决于日期)在第一个数据框中创建一个新列。

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']

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

显然df1 ['Divided'] = df1 ['Date','Count']。div [df2 ['Date','Average']无效,但这是一种想法。我已经尝试了各种方法,包括转换为字典并尝试映射值,但我无法弄清楚。

python pandas dataframe multi-index
1个回答
0
投票

将'df2'加入到'df1'的日期,以使行数相同并相除。它符合问题的意图吗?

df1.reset_index(inplace=True)
df2.reset_index(inplace=True)

df3 = pd.merge(df1['Date'], df2, on='Date', how='inner')
df1['Divided'] = df1['Count'] / df3['Average']

df1
    Date    Animal  Dose    Count   Divided
0   2020-02-01  Cat 0   10  10.000000
1   2020-02-01  Cat 2   5   5.000000
2   2020-02-01  Dog 1   7   7.000000
3   2020-02-03  Cat 0   3   0.600000
4   2020-02-03  Cat 1   4   0.800000
5   2020-02-03  Dog 2   10  2.000000
6   2020-02-05  Cat 0   1   0.333333
7   2020-02-05  Cat 2   17  5.666667
8   2020-02-05  Dog 1   20  6.666667
9   2020-02-08  Dog 0   13  0.419355
10  2020-02-08  Dog 1   13  0.419355
11  2020-02-09  Cat 0   30  2.142857
12  2020-02-09  Cat 2   1   0.071429
13  2020-02-09  Dog 1   12  0.857143
14  2020-02-09  Dog 2   14  1.000000
© www.soinside.com 2019 - 2024. All rights reserved.