大熊猫中的条件成对计算

时间:2019-09-13 15:43:24

标签: python pandas dataframe

例如,我有2个dfs:

df1

ID,col1,col2
1,5,9
2,6,3
3,7,2
4,8,5

另一个df是

df2

ID,col1,col2
1,11,9
2,12,7
3,13,2

我想计算从df2到df1的第一个成对减法。我正在通过功能scipy.spatial.distance

使用subtract_
def subtract_(a, b):
    return abs(a - b)

d1_s = df1[['col1']]
d2_s = df2[['col1']]

dist = cdist(d1_s, d2_s, metric=subtract_)

dist_df = pd.DataFrame(dist, columns= d2_s.values.ravel())
print(dist_df)

 11   12   13
6.0  7.0  8.0
5.0  6.0  7.0
4.0  5.0  6.0
3.0  4.0  5.0

现在,我要检查这些新列的名称,例如11,1213。我正在检查此新dataframe中是否有小于5的值。如果有,那么我想做进一步的计算。像这样。 例如,此处对于列名'11',小于5的值是4,即rows 3。现在,在这种情况下,我想减去('col2')的列名df1,但在第3行,在这种情况下,它将是值2。我想用df2(col2)减去这个值2,但是在第1行(因为列名'11')是从df2的第1行的值中获得的。

我的for loop太复杂了。如果在熊猫中有一些更简单的方法,那将很好。 任何帮助,建议都会很棒。

期望的新数据框是这个

0,1,2
Nan,Nan,Nan
Nan,Nan,Nan
(2-9)=-7,Nan,Nan
(5-9)=-4,(5-7)=-2,Nan

2 个答案:

答案 0 :(得分:1)

在您的情况下,将numpymask一起使用

df.mask(df<5,df-(df1.col2.values[:,None]+df2.col2.values))
Out[115]: 
     11   12   13
0   6.0  7.0  8.0
1   5.0  6.0  7.0
2  -7.0  5.0  6.0
3 -11.0 -8.0  5.0

更新

Newdf=(df-(-df1.col2.values[:,None]+df2.col2.values)-df).where(df<5)
Out[148]: 
    11   12  13
0  NaN  NaN NaN
1  NaN  NaN NaN
2 -7.0  NaN NaN
3 -4.0 -2.0 NaN

答案 1 :(得分:1)

类似于Ben的回答,但带有np.where

pd.DataFrame(np.where(dist_df<5, df1.col2.values[:,None] - df2.col2.values, np.nan),
             index=dist_df.index,
             columns=dist_df.columns)

输出:

    11   12  13
0  NaN  NaN NaN
1  NaN  NaN NaN
2 -7.0  NaN NaN
3 -4.0 -2.0 NaN
相关问题