我有一个 pandas 数据框,如下所示
dfx = pd.DataFrame({'min_temp' :[38,36,np.nan,38,37,39],'max_temp': [41,39,39,41,43,44],
'min_hr': [89,87,85,84,82,86],'max_hr': [91,98,np.nan,94,92,96], 'min_sbp':[21,23,25,27,28,29],
'ethnicity':['A','B','C','D','E','F'],'Gender':['M','F','F','F','F','F']})
我想做的是
1) 识别包含 min
和 max
的所有列。
2) 找到它们对应的对。例如:min_temp
和 max_temp
是一对。同样,min_hr
和 max_hr
是一对
3) 将这两列转换为一列,并将其命名为rel_temp
。公式见下文
rel_temp = (max_temp - min_temp)/min_temp
这就是我正在尝试的。请注意,我的真实数据有数千条记录和数百列,如下所示
def myfunc(n):
return lambda a,b : ((b-a)/a)
dfx.apply(myfunc(col for col in dfx.columns)) # didn't know how to apply string contains here
我希望我的输出是这样的。请注意,只有 min
和 max
列需要转换。数据框中的其余列应保持原样。
最佳答案
想法是使用 DataFrame.filter
相同的列名称创建 df1
和 df2
和重命名
,然后将所有列减去并除以 DataFrame.sub
和 DataFrame.div
:
df1 = dfx.filter(like='max').rename(columns=lambda x: x.replace('max','rel'))
df2 = dfx.filter(like='min').rename(columns=lambda x: x.replace('min','rel'))
df = df1.sub(df2).div(df2).join(dfx.loc[:, ~dfx.columns.str.contains('min|max')])
print (df)
rel_temp rel_hr ethnicity Gender
0 0.078947 0.022472 A M
1 0.083333 0.126437 B F
2 NaN NaN C F
3 0.078947 0.119048 D F
4 0.162162 0.121951 E F
5 0.128205 0.116279 F F
关于python - 识别最小、最大列并将其转换为相对差异列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59354257/