【问题标题】:Delete substrings in pandas DataFrame with python使用python删除pandas DataFrame中的子字符串
【发布时间】:2020-10-12 13:05:21
【问题描述】:

如果当前索引处的术语是以下术语的子字符串,我希望我的 python 脚本删除 DataFrame 中的一行。此外,如果以下术语是当前索引处的术语的子字符串。

在下面的示例中,只有最后一个带有术语“A 600 Strom”的数据集以及“Silent”应保留。

    term            timestamp
83  A 6             2018-09-27 18:26:46
85  A 60            2018-09-27 18:26:46
86  A 600           2018-09-27 18:26:46
89  A 600           2018-09-27 18:26:47
91  A 600 S         2018-09-27 18:26:47
93  A 600 Str       2018-09-27 18:26:48
95  A 600 Stro      2018-09-27 18:26:49
97  A 600 Str       2018-09-27 18:26:53
98  A 600 Strom     2018-09-27 18:26:5
99  S               2018-09-27 18:26:48
100 Sil             2018-09-27 18:26:49
101 Silen           2018-09-27 18:26:53
102 Silent          2018-09-27 18:26:5

是否有优雅高效的解决方案,还是我必须在循环中处理一系列 if 语句?

【问题讨论】:

  • 是始终采用相同格式的术语 A 600 StormB 250 RainB 2 将是它的子集
  • 不是。它也可能是“天气”之类的东西,“天气”将是一个子集。为了更好地理解:数据来自收集用户所有搜索查询的应用程序,因此该术语可以是任何格式
  • 表中有用户键吗?
  • 是的,但不幸的是它不一致,因此不能真正使用

标签: python pandas dataframe substring


【解决方案1】:

使用Series.shift 移动term 列并将其分配给new_column s_1,然后使用DataFrame.aggaxis=1 通过比较前一个术语与下一个术语(s_1) 来创建布尔值mask @ 并将下一个术语(s_1) 与上一个术语进行比较。最后使用这个mask 过滤数据框:

mask = (
    df.assign(s_1=df['term'].shift(-1).astype(str))
    .agg(lambda s: s['term'] in s['s_1'] or s['s_1'] in s['term'], axis=1)
)

df1 = df[~mask]

结果:

# print(df1)
           term            timestamp
98  A 600 Strom  2018-09-27 18:26:53

【讨论】:

  • 正是我需要的。非常感谢!
猜你喜欢
  • 2019-12-30
  • 2018-03-16
  • 1970-01-01
  • 2016-04-18
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
相关资源
最近更新 更多