2017-08-29 57 views
1

我有一个数据帧,其列A,B,C含有整数和字符串这样的混合物的数据帧的最小/最大值:查找含有整数和字符串

a | b | c 
0.82 | 1.17 | 2.05 
0.02 | ND | ND 
2.00 | 1.08 | 0.02* 

我需要找到最小/ max值,并将相应的值填入标题为“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 *。我需要我填写了“民”栏目做了一个整数的比较,但保值,所以最终的结果会是什么样子

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值,以便手动更换不是一个选项。我考虑先删除*,但我不知道如何在必须填充最小/最大列时恢复它们。

如果任何人有解决此问题的任何建议,将不胜感激,谢谢。

+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 

现在,应用maxmin

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 
+0

不幸的是我不能使用这个方法,就像我原来的文章中指定的那样。我需要ND为最小值,并且需要将*保留在我的最大/最小列中。 –

+1

用-np.inf而不是np.nan替换'ND'? – AK47

+0

您可以保留*。但是在计算min-max时将其删除。 –