我是熊猫新手,我正在使用以下代码根据其他现有列的条件创建新列:
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循环是最好的选择吗?谢谢。
答案 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)