提问人:Tyler D 提问时间:3/2/2019 更新时间:3/2/2019 访问量:1756
按指数逐元素乘以 pandas
Element-wise multiplication of pandas by indices
问:
我有两个数据帧和:df1
df2
df1 = pd.DataFrame({"a" : [1,2,3,4,5,6,7,8,9,10,11,12],
"b" : [-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12],
"t" : [1,2,3,4,5,6,7,8,9,10,11,12]})
df1.index = [1,1,1,2,2,2,3,3,3,4,4,5]
df2 = pd.DataFrame({"a" : [10,20,30],
"b" : [-10,-20,-30]})
df2.index = [2,3,4]
它们看起来像这样:
df1
a b t
1 1 -1 1
1 2 -2 2
1 3 -3 3
2 4 -4 4
2 5 -5 5
2 6 -6 6
3 7 -7 7
3 8 -8 8
3 9 -9 9
4 10 -10 10
4 11 -11 11
5 12 -12 12
df2
a b
2 10 -10
3 20 -20
4 30 -30
因此,的列是 的列的子集。我想将 的行与它们具有相同索引的行相乘,并且只保留由其索引之间的交集组成的行,即基本上df2
df1
df1
df2
ls_keep = []
for i in range(len(df1)):
for j in range(len(df2)):
if df1.index[i] == df2.index[j]:
df1.iloc[i]["a"] = df1.iloc[i]["a"] * df2.iloc[j]["a"]
df1.iloc[i]["b"] = df1.iloc[i]["b"] * df2.iloc[j]["b"]
ls_keep.append(i)
df1 = df1.iloc[ls_keep]
这给了我
a b t
2 40 40 4
2 50 50 5
2 60 60 6
3 140 140 7
3 160 160 8
3 180 180 9
4 300 300 10
4 330 330 11
此代码按预期工作,但非常不专业且冗长,以防不止两列。有没有办法使用 的函数来优化它?pandas
答:
3赞
jezrael
3/2/2019
#1
首先,通过布尔索引
和 isin
仅将索引与 new 匹配,然后通过 mul
with 过滤多个索引,以处理两个 s 中的相同列:DataFrame
df2.columns
DataFrame
df11 = df1[df1.index.isin(df2.index)].copy()
df11[df2.columns] = df11[df2.columns].mul(df2)
print (df11)
a b t
2 40 40 4
2 50 50 5
2 60 60 6
3 140 140 7
3 160 160 8
3 180 180 9
4 300 300 10
4 330 330 11
上一个:优化嵌套的 for 循环
评论