我有一个数据框,其中a,b,c列包含整数和字符串,如下所示:
a | b | c
0.82 | 1.17 | 2.05
0.02 | ND | ND
2.00 | 1.08 | 0.02*
我需要找到每行的最小/最大值,并使用相应的值填充标题为“Min”/“Max”的新的第四/第五列,同时将ND视为最小值。我可以用
找到第一行的最小/最大值df.loc[["a", "b", "c"]].min(axis=1)
#and max(axis=1)
并使用
为第二个工作df.loc[((data["a"].isin(["ND"])) | (data["b"].isin(["ND"])) |
(data["c"].isin(["ND"])), "Min"] = "ND"
但不知道我应该为第三排的0.02 *做些什么。我需要对整数进行比较,但在填充“Min”列时保持值,因此最终结果看起来像
a | b | c | Min | Max
0.82 | 1.17 | 2.05 | 0.82 | 2.05
0.02 | ND | ND | ND | 0.02
2.00 | 1.08 | 0.02* | 0.02* | 2
我的整个数据框中有*超过200个值,因此无法手动替换。我考虑先删除*但不确定当我必须填充min / max列时如何恢复它们。
如果有人有解决方法,我们将不胜感激,谢谢。
答案 0 :(得分:3)
看起来您需要对数据进行一些内务管理。有几个df.replace
来电应该这样做:
df = df.astype(str).replace('ND', np.nan)\
.replace('\*', '', regex=True).astype(float)
print(df)
a b c
0 0.82 1.17 2.05
1 0.02 NaN NaN
2 2.0 1.08 0.02
现在,应用max
和min
:
df['Max'] = df.max(1)
df['Min'] = df.min(1)
print(df)
a b c Max Min
0 0.82 1.17 2.05 2.05 0.82
1 0.02 NaN NaN 0.02 0.02
2 2.00 1.08 0.02 2.00 0.02
根据您的约束进行更新:
dftemp = df.astype(str).replace('ND', -np.inf)\
.replace('\*', '', regex=True).astype(float)
df['Max'] = dftemp.max(1)
df['Min'] = dftemp.min(1).replace(-np.inf, 'ND')
print(df)
a b c Max Min
0 0.82 1.17 2.05 2.05 0.82
1 0.02 ND ND 0.02 ND
2 2.0 1.08 0.02* 2.00 0.02