min(axis=1, numeric_only=True) 的作用
在 pandas DataFrame 中,某些情况下,数据可能包含 数值列 和 非数值列(如字符串列) 。如果直接使用 min(axis=1),pandas 可能会尝试对 所有列 进行计算,导致 错误 或 意外行为。
numeric_only=True 选项的作用是:
✅ 忽略非数值列,确保 min() 仅对 数值列 计算,避免错误。
🔹 举例 1:含有字符串列,未指定 numeric_only=True
import pandas as pd
# 创建 DataFrame,包含数值和字符串列
df = pd.DataFrame({
'modelCode': ['A1', 'A2', 'A3'],
'price1': [100, 200, 150],
'price2': [90, 220, 130],
'channel': ['京东', '天猫', '淘宝'] # 非数值列
})
# 直接使用 min(axis=1) 会报错
df["min_price"] = df.min(axis=1)
❌ 结果(报错)
TypeError: '<=' not supported between instances of 'int' and 'str'
🔍 解释:
min(axis=1)默认会尝试计算所有列,包括modelCode和channel(字符串列)。- 由于 数值和字符串不能比较,导致 TypeError。
🔹 举例 2:使用 numeric_only=True
df["min_price"] = df.min(axis=1, numeric_only=True)
print(df)
✅ 结果
| modelCode | price1 | price2 | channel | min_price |
|---|---|---|---|---|
| A1 | 100 | 90 | 京东 | 90 |
| A2 | 200 | 220 | 天猫 | 200 |
| A3 | 150 | 130 | 淘宝 | 130 |
🔍 解释:
numeric_only=True自动忽略 了modelCode和channel(非数值列) ,只在price1和price2上计算min()。
🔹 举例 3:max 和 min 计算
df["max_price"] = df.max(axis=1, numeric_only=True)
df["price_range"] = df["max_price"] - df["min_price"]
print(df)
✅ 结果
| modelCode | price1 | price2 | channel | min_price | max_price | price_range |
|---|---|---|---|---|---|---|
| A1 | 100 | 90 | 京东 | 90 | 100 | 10 |
| A2 | 200 | 220 | 天猫 | 200 | 220 | 20 |
| A3 | 150 | 130 | 淘宝 | 130 | 150 | 20 |
🔍 解释:
min_price = min(axis=1, numeric_only=True)计算最小值(仅数值列)。max_price = max(axis=1, numeric_only=True)计算最大值(仅数值列)。price_range = max_price - min_price,计算price1和price2的差值。
📌 总结
| 方法 | 是否忽略非数值列 | 会报错? |
|---|---|---|
min(axis=1) | ❌ 不会(尝试计算所有列) | 可能会报错(如果有字符串列) |
min(axis=1, numeric_only=True) | ✅ 会忽略非数值列 | 不会报错,结果正确 |
✅ 最佳实践:如果 DataFrame 里有 非数值列,计算 min()、max() 时 务必加上 numeric_only=True 以避免错误。