[英]For loop and conditions on pandas dataframe
假设我有以下列表:
l = ['AF_','LT_']
以及以下数据框:
df = pd.DataFrame({'col1':[1,2,3,4,5],'col2':['AF_123_PX','OX','AF','BX','LT_123']})
col1 col2
0 1 AF_123_PX
1 2 OX
2 3 AF
3 4 BX
4 5 LT_123
现在我想迭代col2
的值,如果我看到l
的元素,我会将它分开并将它们归咎于新列,如果没有,我将分配全局。 结果应如下所示:
col1 col2 col3 col4
0 1 AF_123_PX AF 123_PX
1 2 OX Global OX
2 3 AF Global AF
3 4 BX Global BX
4 5 LT_123 LT 123
如您所见,列表l
存在AF_
和LT_
。 我写了以下内容:
for index, row in df.iterrows():
if df['col2'].str.contains(l):
df['col3'] == l
df['col4'] == df.col2.str.split("_", n=1).str[1]
else:
df['col3'] == 'Global'
df['col4'] == df['col2']
哪个不起作用,我想知道我哪里出错了?
尝试:
l = ['AF_','LT_']
#your list
c=df['col2'].str.contains(f'({"|".join(l)})')
#checking if any element inside your list is present in col2 or not
最后:
df.loc[~c,'col2']='Global_'+df.loc[~c,'col2']
#adding 'Global_' to col2 where the condition c failed
df[['col3','col4']]=df['col2'].str.split('_',1,expand=True)
#Finally spliting the columns and assigning it to df
df
输出:
col1 col2 col3 col4
0 1 AF_123_PX AF 123_PX
1 2 Global_OX Global OX
2 3 Global_AF Global AF
3 4 Global_BX Global BX
4 5 LT_123 LT 123
我通常会建议不要创建新列,因为字符串将被拆分为超过 2 个部分的情况,那么您可以像这样存储它:
df['col3'] = df['col2'].str.split('({})'.format('|'.join(l))).map(lambda x: [y for y in x if y != ''])
col1 col2 col3
0 1 AF_123_PX [AF_, 123_PX]
1 2 OX [OX]
2 3 AF [AF]
3 4 BX [BX]
4 5 LT_123 [LT_, 123]
也就是说,您可以像这样实现预期的输出:
df[['col3', 'col4']] = df['col2'].str.split('({})'.format('|'.join(l)), expand = True).drop(0,axis=1)
df['col3'] = df['col3'].fillna('Global')
df.loc[df['col4'].isna(), 'col4'] = df.loc[df['col4'].isna(), 'col2']
col1 col2 col3 col4
0 1 AF_123_PX AF_ 123_PX
1 2 OX Global OX
2 3 AF Global AF
3 4 BX Global BX
4 5 LT_123 LT_ 123
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.