pandas 如果至少有一列大于特定值,如何标记行

2nbm6dog  于 2023-04-04  发布在  其他
关注(0)|答案(3)|浏览(172)

我有一个pandas数据框架如下;
| 唯一ID|值_1|数值2|数值3|
| --------------|--------------|--------------|--------------|
| 一一一|10个|五十|十八岁|
| 二百二十二|五|八|第二章|
| 三百三十三|十二岁|三|五|
如果从Value_1Value_3的列中至少有一列大于10,我希望在pandas数据框中创建一个新列,并创建一个标记(1)。
所需的输出如下;
| 唯一ID|值_1|数值2|数值3|列标签|
| --------------|--------------|--------------|--------------|--------------|
| 一一一|10个|五十|十八岁|1|
| 二百二十二|五|八|第二章|0|
| 三百三十三|十二岁|三|五|1|
我尝试了以下代码,结果出现错误:

def flag_df_new(df):
    
    if (df[df.columns[2:]]>10).any(axis=1):
        return 1
    else:
        return 0
    
customer_summary_1['Flag'] = customer_summary_1.apply(flag_df_new, axis = 1)

我得到的结果是:

AttributeError: 'Series' object has no attribute 'columns'
6tdlim6h

6tdlim6h1#

可以在每列上使用布尔表达式:

df['tag'] = ((df['Value_1']>10) | (df['Value_2']>10) | (df['Value_3'] > 10)).astype(int)
df

如果你想在任意数量的列上这样做,这可以工作df['tag'] = (df[df.columns[1:]] > 10).any(axis=1)

crcmnpdw

crcmnpdw2#

过滤Value*列以检查它们是否符合所需条件:

df['tag'] = (df.filter(like='Value') > 10).any(axis=1).astype(int)
Unique ID  Value_1  Value 2  Value 3  tag
0        111       10       50       18    1
1        222        5        8        2    0
2        333       12        3        5    1
toiithl6

toiithl63#

你可以这样尝试:

# import pandas as pd
# df = pd.read_html('https://stackoverflow.com/questions/75897954')[0] # scraped from your q

valCols = [c for c in df.columns if c.startswith('Value')]
df['Flag'] = df[valCols].apply(lambda r: int(any(v>10 for v in r)), axis='columns')

错误的原因是,当您将函数传递给.apply时,它不是以DataFrame作为参数调用的,而是在它的每一列[或它的每一行,如果您如上所述指定 axis='columns'(或像您这样指定 axis=1)]上调用。

# flag_df_new = lambda df_row: 1 if any(v>10 for v in df_row[1:]) else 0 ## same as
def flag_df_new(df_row):
    return 1 if any(v>10 for v in df_row[1:]) else 0

相关问题