我有一个带有字符串列的pandas数据帧。字符串长度为2或3个字符,我必须过滤掉第三个字符为' W'的字符串。到目前为止我已经
了df[df.col_name.str[2] == 'W']
只要df.col_name包含其中包含2个和3个字符的字符串,就可以正常工作。但是,当df.col_name仅包含2个字符的字符串时,代码崩溃并显示错误:
TypeError: invalid type comparison
有没有办法让这两种情况都有效?
答案 0 :(得分:2)
您可以使用apply
函数将自定义函数作为参数。自定义函数可以包含任意逻辑,在您的情况下,它会检查第三个字符是否为' W'。
这应该做的工作:
import pandas as pd
df = pd.DataFrame({'A':['a','ab','abW']})
def custom_filter(str):
if len(str) >= 3 and str[2] == 'W':
return str[2]
else:
return ""
df['new'] = df['A'].apply(custom_filter)
print(df['new'])
不使用custom_filter
函数的较短方法是:
df[df['A'].apply(lambda x: len(x)>=3 and x[2]=='W')]
答案 1 :(得分:2)
您可以使用pd.Series.str.pad
。
我们的想法是在提取第3个元素之前使用空格填充,假设您没有在中搜索空格。
df = pd.DataFrame({'A': ['abcd', 'ab', 'abWdfa', 'abW', 'abWabc']})
res = df.loc[df['A'].str.pad(3, 'right').str[2] == 'W']
print(res)
# A
# 2 abWdfa
# 3 abW
# 4 abWabc
答案 2 :(得分:-2)
你可以这样做:
len(col_name.str) == 3 and col_name.str[2] == 'W'
如果长度< 3,后者不会被执行。