我有以下DataFrame:

data: Dict[str, list[int]] = {
    "x1": [5 , 6, 7, 8, 9],
    "min1": [3 , 3, 3, 3, 3],
    "max1": [8, 8, 8, 8, 8],
    "x2": [0 , 1, 2, 3, 4],
    "min2": [2 , 2, 2, 2, 2],
    "max2": [7, 7, 7, 7, 7],
    "x3": [7 , 6, 7, 6, 7],
    "min3": [1 , 1, 1, 1, 1],
    "max3": [6, 6, 6, 6, 6],
}
n: int = 3 # number of xi
df: pd.DataFrame = pd.DataFrame(data=data)
print(df)

Output

   x1  min1  max1  x2  min2  max2  x3  min3  max3
0   5     3     8   0     2     7   7     1     6
1   6     3     8   1     2     7   6     1     6
2   7     3     8   2     2     7   7     1     6
3   8     3     8   3     2     7   6     1     6
4   9     3     8   4     2     7   7     1     6

我想在df中添加一个新的列alert,其中包含ID ixi < mini or xi > maxi.

Expected result

   x1  min1  max1  x2  min2  max2  x3  min3  max3   alert
0   5     3     8   0     2     7   7     1     6   "2,3"
1   6     3     8   1     2     7   6     1     6     "2"
2   7     3     8   2     2     7   7     1     6     "3"
3   8     3     8   3     2     7   6     1     6      ""
4   9     3     8   4     2     7   7     1     6   "1,3"

我查看了this个答案,但无法理解如何将其应用于我的问题.
下面是我希望改进的工作实现.

def f(row: pd.Series) -> str:
    alert: str = ""
    for k in range(1, n+1):
        if row[f"x{k}"] < row[f"min{k}"] or row[f"x{k}"] > row[f"max{k}"]:
            alert += f"{k}"
    return ",".join(list(alert))

df["alert"] = df.apply(f, axis=1)

推荐答案

实际上,考虑到您的输出是字符串,您的方法还不错.我只建议一份 list 列出alert个,而不是一个字符串:

def f(row: pd.Series) -> str:
    alert: list = []
    for k in range(1, n+1):
        if row[f"x{k}"] < row[f"min{k}"] or row[f"x{k}"] > row[f"max{k}"]:
            alert.append(f"{k}")

    return ",".join(alert)

以一种有点花哨的方式,你可以做到:

xs = df.filter(regex='^x')
mins = df.filter(like='min').to_numpy()
maxes = df.filter(like='max').to_numpy()

mask = (xs < mins) | (xs > maxes)
df['alert'] = ( mask @ xs.columns.str.replace('x',',')).str.replace('^,','')

Python-3.x相关问答推荐

无法使用Python发送带有参数和标头的POST请求

在 sum() 中将字符串转换为 int (或 float)

如何在当前测试中使用fixture 转换后的数据进行参数化?

为什么 get_form 方法中小部件的更改没有反映 Django 管理站点中的更改

requests.exceptions.InvalidSchema:未找到连接适配器.我试图遍历一个列表

ImportError:抓取数据后找不到 html5lib

如何通过 python 使用 auth no priv 获取 SNMPv3?

拆分列表的元素并将拆分后的元素包含到列表中

try 使用 GEKKO 求解非线性方程组.系统有多种解决方案,但 GEKKO 给出了错误的解决方案.我该如何解决?

Python Regex 查找给定字符串是否遵循交替元音、辅音或辅音、元音的连续模式

解包时是否可以指定默认值?

python tkInter 浏览文件夹按钮

Python socket.error: [Errno 13] 权限被拒绝

smtplib 在 Python 3.1 中发送带有 unicode 字符的邮件的问题

用于 Django 应用程序的 Cython:它会工作吗?

在python中,如果一个函数没有return语句,它会返回什么?

Selenium Python - 处理没有这样的元素异常

Python 2 与 Python 3 - urllib 格式

如何阻止散景在 Jupyter Notebook 中打开新标签?

如何将python日志(log)级别名称转换为整数代码