我有一个这样的数据框:
var SendOnBehalfOf = 'mr-ceo@example.com';
var creds = JSON.stringify({
Username: email,
Password: password,
IntegratorKey: integratorKey,
SendOnBehalfOf: SendOnBehalfOf
});
我有另一个数据框如下:
id1 name id2 val
0 1 'A' 1 4
1 1 'B' 1 1
2 2 'C' 3 1
.
.
.
我想按如下方式制作第一个数据帧:
new_val
1 2
3 4
我想要做的是将第一个数据帧中的val列除以与索引匹配的值id2。我们看到id2 = 1然后我们将val = 4除以2,因为它对应于索引1. id2 = 3然后我们将val = 1除以4得到0.25。
我知道我可以将它们添加到元组列表中并执行计算并重置列,但这是否可以使用pandas函数?对于非常大的数据集使用for循环将在计算上非常昂贵。
答案 0 :(得分:2)
嗯,这种方式可能节省空间,但它应该比循环更快:
>>> df1
id1 name id2 val
0 1 'A' 1 4
1 1 'B' 1 1
2 2 'C' 3 1
>>> df2 = pd.DataFrame([2,4], index=[1,3])
>>> df2
0
1 2
3 4
所以,首先设置一个索引:
>>> df1.set_index('id2', inplace=True)
然后,使用我认为正确索引的df2:
>>> df1['divisor'] = df2
>>> df1
id1 name val divisor
id2
1 1 'A' 4 2
1 1 'B' 1 2
3 2 'C' 1 4
>>> df1.val / df1.divisor
id2
1 2.00
1 0.50
3 0.25
dtype: float64
最后,只是为了完成:
>>> df1['val'] = df1.val / df1.divisor
>>> df1
id1 name val divisor
id2
1 1 'A' 2.00 2
1 1 'B' 0.50 2
3 2 'C' 0.25 4
>>> df1.drop('divisor',inplace=True, axis=1)
>>> df1
id1 name val
id2
1 1 'A' 2.00
1 1 'B' 0.50
3 2 'C' 0.25
答案 1 :(得分:2)
有很多方法可以做到这一点。您可以先处理' new_val'从第二个DataFrame到第一个的列,然后从那里操作列。
List<string> BlockList = new List<string>();
产生:
df.join(df2, on='id2')
然后对列进行操作
id1 name id2 val new_val
0 1 'A' 1 4 2
1 1 'B' 1 1 2
2 2 'C' 3 1 4
还有一些衬垫
df_final['val'] = df_final['val'] / df_final['new_val']
df_final.drop('new_val', axis=1, inplace=True)
id1 name id2 val
0 1 'A' 1 2.00
1 1 'B' 1 0.50
2 2 'C' 3 0.25
答案 2 :(得分:2)
使用map
和/=
df1.val /= df1.id2.map(df2.new_val)
print(df1)
id1 name id2 val
0 1 'A' 1 2.00
1 1 'B' 1 0.50
2 2 'C' 3 0.25