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