【问题标题】:Pandas - Check if a value in a column is a substring of another value in the same columnPandas - 检查列中的值是否是同一列中另一个值的子字符串
【发布时间】:2020-03-15 23:37:31
【问题描述】:

我正在尝试编写一个脚本来检查 DataFrame 的列,每个值不是另一个值的子字符串,并且不等于不同的列。我编写了一个代码,它遍历 iterrows 并为每一行返回其他子字符串值。一个例子:

df = pd.DataFrame({'names': ['Bob', 'Sam', 'Tom', 'Bob'], 'value': ['abc', 'ab', 'de', 'ab']})
>>> df
  names value
0   Bob   abc
1   Sam    ab
2   Tom    de
3   Bob    ab

substring_df = pd.DataFrame(columns=df.columns)
for index, row in df.iterrows():
            value = row["value"]
            name = row["names"]
            delta = df[df['value'].str.contains(value) & df['names'] == name]
            if(len(delta.index) > 1):
                    substring_df = pd.concat([substring_df, delta])
>>> substring_df
  names value
0   Bob   abc
3   Bob    ab

此代码运行良好,但处理大量数据时速度非常慢。在包含 10,000 行的 DataFrame 上运行它需要 2 分钟才能返回,我需要在更大的数据上运行它。

关于如何使这段代码更高效的任何想法?

【问题讨论】:

  • 它不工作。看下面的例子: df = pd.DataFrame({"name": ["Bob", "Bob", "Bob", "Alice"], "value": ["abc", "ab", "d ", "a"]}) Bob, d 也返回 - 但它不是另一行的子字符串。
  • 答案已编辑。
  • 运行良好 - 非常感谢您的帮助。

标签: python pandas performance dataframe bigdata


【解决方案1】:

使用GroupBy.transform 与生成器一起使用in 和通过boolean indexing 过滤组:

df = pd.DataFrame({"names": ["Bob", "Bob", "Bob", "Alice"], "value": ["abc", "ab", "d", "a"]}) 
print (df)
   names value
0    Bob   abc
1    Bob    ab
2    Bob     d
3  Alice     a

f = lambda x: x.isin([w for y in x for z in x if z != y and z in y for w in (z, y)])

df = df[df.groupby('names')['value'].transform(f)]
print (df)
  names value
0   Bob   abc
1   Bob    ab

【讨论】:

    猜你喜欢
    • 2022-07-01
    • 1970-01-01
    • 2022-12-12
    • 2021-02-21
    • 2017-10-06
    • 2021-10-26
    • 2016-07-16
    • 2021-07-31
    • 2021-12-29
    相关资源
    最近更新 更多