通过匹配另一个数据帧中的索引来划分数据帧列

时间:2017-01-18 00:05:12

标签: python pandas

我有一个这样的数据框:

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循环将在计算上非常昂贵。

3 个答案:

答案 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