熊猫:如果它不存在,获得系列或者nan的唯一值

时间:2016-09-02 09:47:03

标签: python pandas

我在数据帧上做了一些更复杂的操作,我比较了两行,它们可以在帧中的任何位置。

以下是一个例子:

import pandas as pd
import numpy as np

D = {'A':['a','a','c','e','e','b','b'],'B':['c','f','a','b','d','a','e']\
 ,'AW':[1,2,3,4,5,6,7],'BW':[10,20,30,40,50,60,70]}
P = pd.DataFrame(D)
P = P.sort_values(['A','B'])
P['AB'] = P.A+'_'+P.B
P['AWBW'] = P.AW+P.BW

现在我在这里做的是我在AB中有一对字符串,例如a_c,我称之为AB。我也有反向配对c_a。我对每个配对的数字AWBW求和,称为AWBW

现在我想从a_c的值中减去c_a的求和值,并对存在两个变量的每个字符串配对执行相同的操作。所有其他值应为NaN,因此我的结果应如下所示:

   A  AW  B  BW   AB  AWBW  RowDelta
0  a   1  c  10  a_c    11     -22.0
1  a   2  f  20  a_f    22       NaN
5  b   6  a  60  b_a    66       NaN
6  b   7  e  70  b_e    77      33.0
2  c   3  a  30  c_a    33      22.0
3  e   4  b  40  e_b    44     -33.0
4  e   5  d  50  e_d    55       NaN

我几乎已经解决了这样做的方法,但是我遇到了一个问题。

到目前为止,这是我的解决方案:

for i,row in P.iterrows():
  P.ix[i,'RowDelta'] = row['AWBW']\
   - P[(P['A'] == row.AB[2]) & (P['B'] == row.AB[0])]['AWBW'].get(0,np.nan)

问题是P[(P['A'] == row.AB[2]) & (P['B'] == row.AB[0])]['AWBW']返回一个空的系列,或者只有一个元素,其索引是可变的。

现在series.get方法解决了当系列为空但它想要一个确定的索引值时返回NaN的问题,在这种情况下我使用0,但我无法得到那里的动态指数。

我不能这样做,例如

T = P[(P['A'] == row.AB[2]) & (P['B'] == row.AB[0])]['AWBW']
T.get(T.index[0],np.nan)

因为如果系列为空则没有索引,这会导致T.index[0]时出错。我使用iloc的尝试也是如此。

如果有一个元素(并且从不多于一个元素)同时处理空系列的情况,是否有办法动态获取系列的未知一个索引?

1 个答案:

答案 0 :(得分:2)

信用转到piRSquared,指出我正确的解决方案:

AB = P.AB.str.split('_', expand=True)
AB = AB.merge(AB, left_on=[0, 1], right_on=[1, 0],how='inner')[[0,1]]
AB = AB.merge(P,left_on=[0,1], right_on=['A','B'])[['A','AW','B','BW']]
AB = AB.merge(P,left_on=['A','B'], right_on=['B','A'])[['AW_x','BW_x','AW_y','BW_y','AB']]
AB['RowDelta'] = AB.AW_y+AB.BW_y-AB.AW_x-AB.BW_x
P = P.merge(AB[['AB','RowDelta']],on='AB',how='outer')

也许它可以缩短或更好,它确实有用。