Pandas字符串按位置过滤,长度可变

时间:2018-04-06 11:35:31

标签: python string pandas dataframe

我有一个带有字符串列的pandas数据帧。字符串长度为2或3个字符,我必须过滤掉第三个字符为' W'的字符串。到目前为止我已经

df[df.col_name.str[2] == 'W']

只要df.col_name包含其中包含2个和3个字符的字符串,就可以正常工作。但是,当df.col_name仅包含2个字符的字符串时,代码崩溃并显示错误:

TypeError: invalid type comparison

有没有办法让这两种情况都有效?

3 个答案:

答案 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,后者不会被执行。