在for循环中定义可变的列数

时间:2018-11-26 17:41:48

标签: python pandas dataframe for-loop series

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

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

基本上,这意味着如果商品不存在('NO')而商品已售出('YES'),请给我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循环是最好的选择吗?谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用布尔系列,即True / False,具体取决于您的条件是否得到满足。结合pd.Series.eq和f字符串(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)