我有一个名为df的pandas数据框,看起来像这样
Name
------
Mike
Noel
Kim
Anna
Luke
joseph
joe
如何仅列出包含单词' n'的名称?或者' k'在名字的中间。不是第一个字母,也不是最后一个字母。结果是
namelist = [Mike, Anna, Luke]
答案 0 :(得分:4)
选项1
你可以使用str.contains
-
df.loc[df.Name.str.contains(r'\w[nk]\w'), 'Name'].tolist()
['Mike', 'Anna', 'Luke']
详细
首先,正则表达式 -
\w # any alpha-numeric char
[nk] # character class; letters "n" and "k"
\w # any alpha-numeric char
这确保,如果单词以“n”或“k”开头或结尾(不包含在单词的中间),则不会拾取(“n”或“k”必须在两边都有东西。
一个类似的正则表达式,匹配任何周围的字符(除了字母数字字符)将是 -
r'.[nk].'
或者,如果你想要一个与中间带“n”或“k”的字符串匹配的正则表达式,以及末尾除“n”和“k”之外的任何字符串,请使用 -
r'^[^nk].*[nk].*[^nk]$'
str.contains
来电的输出 -
df.Name.str.contains(r'\w[nk]\w')
0 True
1 False
2 False
3 True
4 True
5 False
6 False
Name: Name, dtype: bool
使用loc
-
df.loc[df.Name.str.contains(r'\w[nk]\w'), 'Name']
0 Mike
3 Anna
4 Luke
Name: Name, dtype: object
现在,调用pd.Series.tolist
会为您提供名称列表。
选项2
使用str.findall
-
df.Name.str.findall(r'^.*\w[nk]\w.*$').str[0].dropna().tolist()
['Mike', 'Anna', 'Luke']
哪个与第一个类似,但有些不同。
详细
首先,findall
调用的输出 - 匹配列表。正则表达式模式与上面相同,但如果找到中间的模式,则略微修改以捕获整个字符串。
df.Name.str.findall(r'^.*\w[nk]\w.*$')
0 [Mike]
1 []
2 []
3 [Anna]
4 [Luke]
5 []
6 []
Name: Name, dtype: object
从每个列表中获取第一个元素。空列表返回NaN,随后将其删除 -
df.Name.str.findall(r'.*\w[nk]\w.*').str[0].dropna()
0 Mike
3 Anna
4 Luke
Name: Name, dtype: object
从那里,使用pd.Series.tolist
转换为列表。
答案 1 :(得分:1)
使用changing KO label和str[1:-1]
删除第一个和最后一个字符,然后按boolean indexing
进行检查:
L = df.loc[df['Name'].str[1:-1].str.contains('n|k'), 'Name'].tolist()
print (L)
['Mike', 'Anna', 'Luke']
编辑:如果有必要,还会排除第一个和最后一个n
或k
值:
m = ~df['Name'].str[0].str.lower().isin(['n','k']) & \
~df['Name'].str[-1].str.lower().isin(['n','k']) & \
df['Name'].str[1:-1].str.contains('n|k')
df = df.loc[m, 'Name'].tolist()
print (df)
['Mike', 'Anna', 'Luke']
答案 2 :(得分:0)
可以在这里使用列表理解。下面的代码还确保不选择像'nnkk'这样的名称(其中n和/或k都位于中间以及一端或两端)。此外,下面和上面的案例都在这里管理:
namelist = df.Name.tolist() # get all names in a list
outlist = [ n
for n in namelist
if n[0].upper() not in ['N','K'] # conditions
and n[-1].upper() not in ['N','K']
and (n.upper().find("N") >=0
or n.upper().find("K") >=0) ]
print(outlist)
输出:
['Mike', 'Anna', 'Luke']