Python 将一个数据帧中标签对应的值乘以另一个数据帧中具有相同标签的所有值

Python 将一个数据帧中标签对应的值乘以另一个数据帧中具有相同标签的所有值,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下两个数据帧: df.head() Out[256]: NUTS_ID t2m HDD DK_HDD Date 2018-01-01 AT1 3.501755 14.498245 0.005033 2018-01-02 AT1 7.686142 10.313858 0.003580 2018-01-03

我有以下两个数据帧:

df.head()
Out[256]: 
           NUTS_ID        t2m        HDD    DK_HDD
Date                                              
2018-01-01     AT1   3.501755  14.498245  0.005033
2018-01-02     AT1   7.686142  10.313858  0.003580
2018-01-03     AT1  10.249952   7.750048  0.002690
2018-01-04     AT1  14.330340   3.669660  0.001274
2018-01-05     AT1   2.928884  15.071116  0.005232

df2.head()
Out[257]: 
                2016         2017            2018  
NUTS_ID                                               
AT1      5104.023345  4422.809561     4363.874907  
AT2      3904.562866  3383.436322     3338.351485  
AT3      6954.504900  6026.314672     5946.013052  
BE1         0.000000     0.000000     2724.610387  
BE2         0.000000     0.000000    14187.414251  
我想将一列中每个索引对应的
df2
中的值乘以具有相同代码的
df
列中的所有值。例如:在
df2
中,我想取索引
AT1
和列
2018
(4363.874907)对应的值,然后将其乘以列
DK_HDD
中带
NUTS_ID=AT1
的所有值,然后与
AT2
相同,依此类推

我预期的结果将是一个具有以下结构的新数据帧:

           NUTS_ID    Product
Date                                              
2018-01-01     AT1    21.9633
2018-01-02     AT1    15.6226
2018-01-03     AT1    11.7388
2018-01-04     AT1     5.5595
2018-01-05     AT1    22.8317 
我尝试使用
mul
,但是我得到了NaN,并且丢失了
NUTS\u ID
列。最好的方法是什么?提前谢谢

以防万一:

df.dtypes
Out[262]: 
NUTS_ID     object
t2m        float64
HDD        float64
DK_HDD     float64
dtype: object

df2.dtypes
Out[263]: 
2016    float64
2017    float64
2018    float64
dtype: object

您可以尝试以下操作:

>>> df1.index = pd.to_datetime(df1.index, format='%Y-%m-%d')
>>> df3 = (df1.loc[:, ['NUTS_ID']]
        .assign(
            Product=df1.apply(
                lambda x: df2.loc[x['NUTS_ID'], 
                str(x.name.year)] * x['DK_HDD'], 
            axis=1)
            )
    )

           NUTS_ID    Product
Date                         
2018-01-01     AT1  21.963382
2018-01-02     AT1  15.622672
2018-01-03     AT1  11.738823
2018-01-04     AT1   5.559577
2018-01-05     AT1  22.831794
注意:如果
df2
列名的类型为
int
,请使用
x.name.year
而不是
str(x.name.year)
合并()
数据帧,然后进行计算。在
merge()
输出中需要索引列,因此使用
reset\u index()

输出
Sayandip Dutta,谢谢你的帮助
df2
列是
float64
。不幸的是,我得到了
AttributeError:'str'对象没有属性'year'
。啊,我以为你的
df1.index
是日期时间索引。让我来修好它。@JavierSando修好了,你能检查一下它现在是否工作吗?不幸的是没有。。。同样的错误,
AttributeError:“str”对象没有属性“year”
df1
有一个
datetime
索引和
NUTS_ID
DK_HDD
列<代码>df2有
螺母ID
索引和
2016
2018
列。
df = pd.read_csv(io.StringIO("""Date           NUTS_ID        t2m        HDD    DK_HDD
                                              
2018-01-01     AT1   3.501755  14.498245  0.005033
2018-01-02     AT1   7.686142  10.313858  0.003580
2018-01-03     AT1  10.249952   7.750048  0.002690
2018-01-04     AT1  14.330340   3.669660  0.001274
2018-01-05     AT1   2.928884  15.071116  0.005232"""), sep="\s+")
df = df.set_index("Date")
df2 = pd.read_csv(io.StringIO("""NUTS_ID                2016         2017            2018  
                                               
AT1      5104.023345  4422.809561     4363.874907  
AT2      3904.562866  3383.436322     3338.351485  
AT3      6954.504900  6026.314672     5946.013052  
BE1         0.000000     0.000000     2724.610387  
BE2         0.000000     0.000000    14187.414251  """), sep="\s+")
df2 = df2.set_index("NUTS_ID")

(df2
 # need NUTS_ID to be a column to allow merge
 .reset_index()
 .merge(df.reset_index(), on="NUTS_ID", how="outer")
 .assign(Product=lambda dfa: dfa["2018"]*dfa["DK_HDD"])
 .drop(columns=["2016","2017","2018","HDD","DK_HDD","t2m"])
 .dropna()
 .set_index("Date")
 
)
    NUTS_ID Product
Date        
2018-01-01  AT1 21.963382
2018-01-02  AT1 15.622672
2018-01-03  AT1 11.738823
2018-01-04  AT1 5.559577
2018-01-05  AT1 22.831794