嵌套IF Pandas

1 投票
2 回答
76 浏览
提问于 2025-04-12 18:49

我想用IF语句在数据框中插入并填充“Mark”这一列的信息。但是在“Duration(Mins)”这一行等于“10.0”时,结果却是None。而“Duration(Mins)”这一列的数据类型是float64。谢谢你的回答。

import pandas as pd

# Define data as a dictionary
data = {
    'Alarm Name': ['Cell Down', '4G Down', '3G Down', '2G Down', 'Cell Unavailable', 'Partial Down', 'Signalling Down'],
    'Duration(Mins)': [3, 5.9, 10.1, 2.9, -12, 6, 10]
}

#Function
def mark(row):
    if row['Duration(Mins)'] >= 0:
        if row['Duration(Mins)'] < 3:
            return '0-3 Mins'
        elif row['Duration(Mins)'] < 6:
            return '3-6 Mins'
        elif row['Duration(Mins)'] < 10:
            return '6-10 Mins'
        elif row['Duration(Mins)'] > 10:
            return '>10 Mins'
    else:
        return 'Open'

df['Mark'] = df.apply(mark, axis=1)

2 个回答

0

如果你需要一种高效的方法(也就是可以同时处理很多数据的方法),可以使用 pandas.cut

df["Mark"] = pd.cut(
    df["Duration(Mins)"],
    bins=[
        -float("inf"),
        0,
        3,
        6,
        10,
        float("inf"),
    ],
    labels=["Open", "0-3 Mins", "3-6 Mins", "6-10 Mins", "> 10 Mins"],
    right=False,
)
         Alarm Name  Duration(Mins)       Mark
0         Cell Down             3.0   3-6 Mins
1           4G Down             5.9   3-6 Mins
2           3G Down            10.1  > 10 Mins
3           2G Down             2.9   0-3 Mins
4  Cell Unavailable           -12.0       Open
5      Partial Down             6.0  6-10 Mins
6   Signalling Down            10.0  > 10 Mins

注意:列 "Mark" 的数据类型会是 pandas.Category

0

这个解决方案能帮到你吗?你在判断条件里漏掉了一个等号,应该是检查是否等于10分钟。

def mark(row):
    if row['Duration(Mins)'] >= 0:
        if row['Duration(Mins)'] < 3:
            return '0-3 Mins'
        elif row['Duration(Mins)'] < 6:
            return '3-6 Mins'
        elif row['Duration(Mins)'] < 10:
            return '6-10 Mins'
        elif row['Duration(Mins)'] >= 10:
            return '>=10 Mins'
    else:
        return 'Open'

df['Mark'] = df.apply(mark, axis=1)

在你的版本中,当时间正好是10分钟的时候,没有被正确处理。

撰写回答