例如,我有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,12
和13
。我正在检查此新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
答案 0 :(得分:1)
在您的情况下,将numpy
与mask
一起使用
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