我想在数据框中添加一个新列retailer_relationship
。
如果'TRUE'
列值以列表retailer
中的任何项目开头,否则我希望retailer_relationship
的新列的每个行值为'FALSE'
。
我尝试过的事情:
list_of_relationships = ("retailer1","retailer2","retailer3")
for i in df.index:
for relationship in list_of_relationships:
if df.iloc[i]['retailer'].str.startswith(relationship):
df.at[i, 'retailer_relationship'] = "TRUE"
else:
df.at[i, 'retailer_relationship'] = "FALSE"
答案 0 :(得分:2)
您可以使用正则表达式,将^
特殊字符(指定字符串的开头)与另一个与retailer_relationship
的每个元素匹配的正则表达式组合在一起,因为startswith
不接受正则表达式:
import re
regex = re.compile('^' + '|'.join(list_of_relationships))
df['retailer_relationship'] = df['retailer'].str.contains(regex).map({True: 'TRUE', False: 'FALSE'})
由于您需要文字字符串'TRUE'
和'FALSE'
,因此我们可以使用map
将布尔值转换为字符串。
另一种方法,其速度稍快,但我认为这并不重要:
df['retailer_relationship'] = df['retailer'].str.contains(regex).transform(str).str.upper()
答案 1 :(得分:0)
看看这是否适合您。共享您的df样本或代表它的虚拟数据将很有帮助。
df.loc['retailer_relationship'] = False
df.loc[df['retailer'].isin(retailer_relationship),'retailer_relationship'] = True
答案 2 :(得分:0)
您仍然可以在startswith
中使用pandas
df['retailer_relationship'] = df['retailer'].str.startswith(tuple(retailer_relationship))