如果以特定字符串结尾,则创建一个新列
Create a new column if ends with certain string
我有一个数据框和一个列表。我想检查列中的字符串是否以列表中的任何内容结尾。我想创建一个新列,显示如果列以列表中的任何内容结尾,则值为 "Y",其他 wiese "N"。我的数据框数据如下所示:
import pandas as pd
city = ['New York', 'Los Angeles','Buffalo','Miami','San Deigo', 'San
Francisco']
population = ['8.5','3.9','0.25','0.45','1.4','0.87']
df = pd.DataFrame({'city':city,'population':population})
ending = ['les','sco', 'igo']
预期结果应如下所示:
city population flag
New York 8.5 N
Los Angeles 3.9 Y
Buffalo 0.25 N
Miami 0.45 N
San Deigo 1.4 Y
San Francisco 0.87 Y
我尝试使用 if 语句:
if df['city'].str.endswith(tuple(ending)):
val = 'Y'
elif df['city'].str.endswith(tuple(ending)):
val= 'Y'
else:
val = 'N'
我收到错误消息:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
有什么建议吗?谢谢!
假设结尾始终是三个字符的字符串,您可以使用:
df['flag']=df['city'].map(lambda x: x[-3:] in ending)
产生
city population flag
0 New York 8.5 False
1 Los Angeles 3.9 True
2 Buffalo 0.25 False
3 Miami 0.45 False
4 San Deigo 1.4 True
5 San Francisco 0.87 True
如果你真的需要二进制结果是 Y/N 而不是 True/False 你可以执行另一个映射:
def bin(arg):
if arg==True:
return 'Y'
return 'F'
df.flag=df.flag.map(lambda x: bin(x))
这导致
city population flag
0 New York 8.5 F
1 Los Angeles 3.9 Y
2 Buffalo 0.25 F
3 Miami 0.45 F
4 San Deigo 1.4 Y
5 San Francisco 0.87 Y
any built-in function 可以提供帮助。
val = 'Y' if any(df['city'].endswith(e) for e in ending) else 'N'
您可以使用 pd.Series.isin
followed by pd.Series.map
with a dictionary mapping. This solution tests specifically the last 3 characters. Otherwise, use .
ending = ['les', 'sco', 'igo']
mapper = {True: 'Y', False: 'N'}
df['flag'] = df['city'].str[-3:].isin(ending).map(mapper)
print(df)
city population flag
0 New York 8.5 N
1 Los Angeles 3.9 Y
2 Buffalo 0.25 N
3 Miami 0.45 N
4 San Deigo 1.4 Y
5 San Francisco 0.87 Y
使用str.endswith
,结束时不需要相同长度的字符串
df.city.str.endswith(tuple(ending)).map({True:'Y',False:'N'})
0 N
1 Y
2 N
3 N
4 Y
5 Y
Name: city, dtype: object
我有一个数据框和一个列表。我想检查列中的字符串是否以列表中的任何内容结尾。我想创建一个新列,显示如果列以列表中的任何内容结尾,则值为 "Y",其他 wiese "N"。我的数据框数据如下所示:
import pandas as pd
city = ['New York', 'Los Angeles','Buffalo','Miami','San Deigo', 'San
Francisco']
population = ['8.5','3.9','0.25','0.45','1.4','0.87']
df = pd.DataFrame({'city':city,'population':population})
ending = ['les','sco', 'igo']
预期结果应如下所示:
city population flag
New York 8.5 N
Los Angeles 3.9 Y
Buffalo 0.25 N
Miami 0.45 N
San Deigo 1.4 Y
San Francisco 0.87 Y
我尝试使用 if 语句:
if df['city'].str.endswith(tuple(ending)):
val = 'Y'
elif df['city'].str.endswith(tuple(ending)):
val= 'Y'
else:
val = 'N'
我收到错误消息:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
有什么建议吗?谢谢!
假设结尾始终是三个字符的字符串,您可以使用:
df['flag']=df['city'].map(lambda x: x[-3:] in ending)
产生
city population flag
0 New York 8.5 False
1 Los Angeles 3.9 True
2 Buffalo 0.25 False
3 Miami 0.45 False
4 San Deigo 1.4 True
5 San Francisco 0.87 True
如果你真的需要二进制结果是 Y/N 而不是 True/False 你可以执行另一个映射:
def bin(arg):
if arg==True:
return 'Y'
return 'F'
df.flag=df.flag.map(lambda x: bin(x))
这导致
city population flag
0 New York 8.5 F
1 Los Angeles 3.9 Y
2 Buffalo 0.25 F
3 Miami 0.45 F
4 San Deigo 1.4 Y
5 San Francisco 0.87 Y
any built-in function 可以提供帮助。
val = 'Y' if any(df['city'].endswith(e) for e in ending) else 'N'
您可以使用 pd.Series.isin
followed by pd.Series.map
with a dictionary mapping. This solution tests specifically the last 3 characters. Otherwise, use
ending = ['les', 'sco', 'igo']
mapper = {True: 'Y', False: 'N'}
df['flag'] = df['city'].str[-3:].isin(ending).map(mapper)
print(df)
city population flag
0 New York 8.5 N
1 Los Angeles 3.9 Y
2 Buffalo 0.25 N
3 Miami 0.45 N
4 San Deigo 1.4 Y
5 San Francisco 0.87 Y
使用str.endswith
,结束时不需要相同长度的字符串
df.city.str.endswith(tuple(ending)).map({True:'Y',False:'N'})
0 N
1 Y
2 N
3 N
4 Y
5 Y
Name: city, dtype: object