python - 识别最小、最大列并将其转换为相对差异列

标签 python python-3.x pandas dataframe apply

我有一个 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) 识别包含 minmax 的所有列。

2) 找到它们对应的对。例如:min_tempmax_temp 是一对。同样,min_hrmax_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

我希望我的输出是这样的。请注意,只有 minmax 列需要转换。数据框中的其余列应保持原样。

enter image description here

最佳答案

想法是使用 DataFrame.filter 相同的列名称创建 df1df2重命名,然后将所有列减去并除以 DataFrame.subDataFrame.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/

相关文章:

python - 如何将有理数或无理数提供给 argparse?

python - Python 字典中的最大值

python-3.x - 将 pyqtgraph(绘图)添加到 QApplication

python - 从 OrderedDict : preserving columns order 列表构建 Pandas DataFrame

python - Sympy 中的模计算失败

Python空构造函数

python - 如何在 django(Python) 中为文章添加评论?

python - 通过 Python paramiko 的 SSH 隧道

Python:将员工姓名与公司、年龄、性别相匹配

python - 使用 ipaddress 库使用 while 循环查找 IP 问题