在包含整数和字符串的混合数据框中查找最小/最大值

Posted

技术标签:

【中文标题】在包含整数和字符串的混合数据框中查找最小/最大值【英文标题】:Find min/max values in a dataframe containing a mixture of integers and strings 【发布时间】:2018-02-07 10:35:38 【问题描述】:

我有一个数据框,其中 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 多个带有 * 的值,因此无法选择手动替换。我考虑先删除 *,但不确定在必须填充最小/最大列时如何恢复它们。

如果有人对此有解决方法,我们将不胜感激,谢谢。

【问题讨论】:

看起来在这些列中,您正在按字典顺序比较字符串。 【参考方案1】:

您似乎需要对数据进行一些整理。几个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

【讨论】:

不幸的是我不能使用这个方法,正如我原来的帖子中所指定的那样。我需要 ND 为最小值,并且需要将 * 保留在我的最大/最小列中。 用 -np.inf 代替 np.nan 替换 'ND'? 您可以保留 *.但是在计算 min-max 时将其删除。 @PeterKwon 好吧,根据你奇怪的要求更新了。 @cᴏʟᴅsᴘᴇᴇᴅ 您的解决方案适用于发布的问题,对此我表示感谢。现在的问题是解决方案与数据框中的其他变量发生冲突......这就是生活。

以上是关于在包含整数和字符串的混合数据框中查找最小/最大值的主要内容,如果未能解决你的问题,请参考以下文章

从数据文件中的一行整数中查找最大值和最小值

用于创建具有数据框中每个日期的最小值和最大值的表的函数

从 __m128i 中查找最小值/最大值

查找熊猫索引数据帧的最小值和最大值

如何在包含子字符串的数据框中查找所有行?

查找金属纹理中的最小值和最大值