【问题标题】:Removing rows from dataframe which don't contain a string of a certain length从数据框中删除不包含特定长度字符串的行
【发布时间】:2020-08-01 00:07:25
【问题描述】:

我有一个数据框,其中包含一个包含 XXX/XX/XXX 形式的字符串的列。我想删除'/'之间的字符串长度不等于2的所有行。

我收到“关键错误:True”,代码如下:

df_issues = df_new[len(df_new['Job'].str.split('/')[1]) != 2 ]

我的方法是创建一个序列,其中包含第一个“/”之后的字符串长度不等于 2 的所有行。

感谢您的帮助。

【问题讨论】:

    标签: python pandas dataframe data-cleaning


    【解决方案1】:

    这里有些地方有问题:

    • len(x) != 2 将返回一个布尔值。即您尝试使用df_new[True] 进行索引,这会返回一个关键错误,因为形状不兼容(您需要一个沿行的索引数组,例如df_new[[True, False, True...]])
    • 您需要再次使用 str 访问器来进一步索引第二个列表

    改用:

    df_new[df_new['Job'].str.split(r'/').str[1].str.len().eq(2.)]
    

    或者我们也可以使用str.contains:

    # corrected with @jon's remarks
    df_new[df_new['Job'].str.contains(r'^.{3}/.{2}/.{3}$',na=False)] 
    

    【讨论】:

    • {0,2} 在这里似乎有点灵活......它可能应该是 {2} 正好是两个,因为我们不知道 X 应该代表什么 - \d 可能是有点太严格了。如果做 contains 也可以验证整个模式 - 也许:^.{3}/.{2}/.{3}$
    • 同意你的两个说法。确实应该是{2},我读错了那部分@jon
    • 否则.../////blah///xx////hello! 将匹配
    • 对,我在那个上跑得很快... :) @jon
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2021-10-13
    • 2019-12-02
    • 2015-04-25
    • 2018-02-25
    • 2020-12-12
    • 2022-11-27
    相关资源
    最近更新 更多