在Pandas中创建布尔列的更快方法

2024-03-29 10:35:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在根据其他列是否包含某些字符串值来创建新的布尔列。在

这就是我试过的

def function(data):
        data["col1"] = 0
        data["col2"] = 0
        data["col3"] = 0
        for i in range(0,len(data)):
            if ("cond1" in data.loc[i,"old_col1"].lower()) or ("cond2" in data.loc[i,"old_col1"].lower()):
                data.loc[i,"col1"] = 1
            elif ("cond3 " in data.loc[i,"old_col1"].lower()) or ("cond4 " in data.loc[i,"old_col2"].lower()):
                data.loc[i,"col2"] = 1
            elif ("cond5 " in in data.loc[i,"old_col1"].lower()) or ("cond6 " in data.loc[i,"old_col3"].lower()):
                data.loc[i, "col3"] = 1

    function(data)

但它不能很好地扩展到更大的数据集。在

有没有更好的方法来实现Boolean列col1-3,它的执行速度更快?在


Tags: or字符串infordatadefrangefunction
3条回答

这可以简化为

data['col1'] = data['old_col1'].apply(lower)=='cond1' | data['old_col1'].apply(lower)=='cond2'

或者

^{pr2}$

简单结构包含在所有数据上

我做了一个示例数据帧,因为你没有提供

  col1       col2        col3
0  foo   cucumber   HogsWatch
1  bar     selery   hogswatch
2  baz  Porcupine  Watch Hogs

您可以使用apply获取一个函数来处理整个数据帧

^{pr2}$

合并回

这意味着您可以用布尔列生成一个新的数据帧,如果需要,可以将其连接到原始数据帧中

bool_df = df.apply(lambda x: x.str.contains('A', flags=re.IGNORECASE))
df = df.merge(bool_df, left_index=True, right_index=True, suffixes=['', '_bool'])

  col1       col2        col3 col1_bool col2_bool col3_bool
0  foo   cucumber   HogsWatch     False     False      True
1  bar     selery   hogswatch      True     False      True
2  baz  Porcupine  Watch Hogs      True     False      True

多重条件

当然,您可以在str.contains中生成更复杂的正则表达式,例如

df.apply(lambda x: x.str.contains('A|O', flags=re.IGNORECASE))

   col1   col2  col3
0  True  False  True
1  True  False  True
2  True   True  True

独立条件

我注意到每个专栏都有不同的条件,这也可以用这种方法来实现,但它有点复杂,尽管仍然很快。在

首先,我们创建所有实际匹配字符串的数据帧

conditions = {"col1": ["ar", "f"], "col2": ["er", "c"], "col3": ["Hog", " "]}
for col_name, strings in conditions:
    regex = "(" + ")|(".join(strings) + ")"
    df_cond = df[col_name].str.extract(regex, flags=re.IGNORECASE).notnull()
    df[col_name + '_matches'] = df_cond.T.max().T

生产

  col1       col2        col3 col1_matches col2_matches col3_matches
0  foo   cucumber   HogsWatch         True         True         True
1  bar     selery   hogswatch         True         True         True
2  baz  Porcupine  Watch Hogs         True        False         True

你应该这样做:

data["col1"] = 0
data["col2"] = 0
data["col3"] = 0
data.loc[data["old_col1"].str.lower().isin(["cond1",  "cond2"]), 'col1'] = 1
data.loc[data["old_col2"].str.lower().isin(["cond3",  "cond4"]), 'col2'] = 1
data.loc[data["old_col3"].str.lower().isin(["cond5",  "cond6"]), 'col3'] = 1

相关问题 更多 >