【问题标题】:Define variable number of columns in for loop在for循环中定义可变列数
【发布时间】:2018-11-26 17:41:48
【问题描述】:

我是 pandas 的新手,我正在使用以下代码根据其他现有列的条件创建新列:

df.loc[(df.item1_existing=='NO') & (df.item1_sold=='YES'),'unit_item1']=1
df.loc[(df.item2_existing=='NO') & (df.item2_sold=='YES'),'unit_item2']=1
df.loc[(df.item3_existing=='NO') & (df.item3_sold=='YES'),'unit_item3']=1

基本上,这意味着如果项目不存在(“否”)并且该项目已售出(“是”)然后给我一个 1。这可以创建 3 个新列,但我认为有一个更好的方法。如您所见,列名中有一个重复的字符串:“_existing”和“_sold”。我正在尝试创建一个 for 循环,它将查找以该特定单词结尾的列的名称并连接开头,如下所示:

unit_cols = ['item1','item2','item3']
for i in unit_cols:
    df.loc[('df.'+i+'_existing'=='NO') & ('df'+i+'_sold'=='YES'),'unit_'+i]=1 

当然,它不起作用。正如我所说,我能够使其与最初的示例一起工作,但我希望使用更少的代码行而不是重复相同的代码,因为我需要以这种方式创建多个列,而不仅仅是三个。有没有办法让这更容易? for 循环是最好的选择吗?谢谢你。

【问题讨论】:

    标签: python pandas dataframe for-loop series


    【解决方案1】:

    您可以使用布尔系列,即True/False,具体取决于您的条件是否满足。结合pd.Series.eq 和 f-strings(PEP498,Python 3.6+),并使用__getitem__(或其语法糖[])来允许字符串输入,您可以编写更具可读性的逻辑:

    unit_cols = ['item1','item2','item3']
    for i in unit_cols:
        df[f'unit_{i}'] = df[f'{i}_existing'].eq('NO') & df[f'{i}_sold'].eq('YES')
    

    如果您需要整数 (1 / 0) 而不是布尔值,您可以通过 astype 进行转换:

        df[f'unit_{i}'] = df[f'unit_{i}'].astype(int)
    

    【讨论】:

    • 这太好了,谢谢。我不知道 f 字符串的存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多