我在数据帧上做了一些更复杂的操作,我比较了两行,它们可以在帧中的任何位置。
以下是一个例子:
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
现在我在这里做的是我在A
和B
中有一对字符串,例如a_c
,我称之为AB
。我也有反向配对c_a
。我对每个配对的数字AW
和BW
求和,称为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
的尝试也是如此。
如果有一个元素(并且从不多于一个元素)同时处理空系列的情况,是否有办法动态获取系列的未知一个索引?
答案 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')
也许它可以缩短或更好,它确实有用。