【问题标题】:How to check if string elements of lists are in dataframe/other list (python)如何检查列表的字符串元素是否在数据框/其他列表中(python)
【发布时间】:2021-09-27 05:27:54
【问题描述】:

我遇到了以下问题。我确实有 2 个列表/数据框。一个是客户列表/数据框,其中每一行都是客户,列是这些客户的同义词,其他口头表达。

customer_list = {'A': ['AA', 'AA', 'AAA'], 'B': ['B', 'BB','BBB'], 'C': ['C','CC','CCC']}
customer_df = pd.DataFrame.from_dict(customer_list, orient='index')

比我有另一个具有以下结构的数据框:

text = [['A', 'Hello i am AA', 'Hello i am BB', 'Hello i am A'], ['B', 'Hello i am B', 'Hello i am BBB','Hello i am BB'], ['C', 'Hello i am AAA','Hello i am CC','Hello i am CCC']]
text_df = pd.DataFrame(text)
text_df = text_df.set_index(0)
text_df = text_df.rename_axis("customer")

如何(哪些类型,哪些功能)我可以检查 text_df 的每一行(例如行“A”的每个元素)是否有“错误条目”,这意味着其他客户的所有元素/同义词(所以检查除了自己的每个条目)。我是否必须在 for 循环中创建多个数据框?一个循环就够了吗?

感谢您的任何建议,即使只是有关方法的提示。 对于我的示例,结果类似于

错误的文字:A:你好,我是 BB, C: 你好,我是 AAA 或者一些相应的指数会很棒。

【问题讨论】:

  • 您的预期输出是什么?你想要一个只有正确值的数据框,还是想要一个包含所有不正确值的列表?
  • 包含错误值和位置的列表

标签: python pandas string loops


【解决方案1】:

首先,我会 pd.melt 将这个 DataFrame 转换为 (customer, column, value) 三元组的“索引”,如下所示:

df = pd.melt(text_df.reset_index(), id_vars="customer", var_name="columns")

现在,我们有了一种“有效”操作整个数据的方法,而无需找出“正确”的列等。所以让我们解决“正确性”问题。

def correctness(melted_row: pd.Series, customer_df: pd.DataFrame) -> bool:
    customer = customer_df.loc[melted_row.customer]
    cust_ids = customer.values.tolist()
    return any([melted_row.value.endswith(cust_id) for cust_id in cust_ids])

注意:您可以将.endswith 替换为各种str 函数以满足您的需求。查看文档,here

最后,您可以使用apply 方法跨行生成掩码,如下所示:

df["correct"] = df.apply(correctness, axis=1, args=(customer_df, ))

然后您将获得如下所示的输出:

  customer columns           value  correct
0        A       1   Hello i am AA     True
1        B       1    Hello i am B     True
2        C       1  Hello i am AAA    False
3        A       2   Hello i am BB    False
4        B       2  Hello i am BBB     True
5        C       2   Hello i am CC     True
6        A       3    Hello i am A    False
7        B       3   Hello i am BB     True
8        C       3  Hello i am CCC     True

我想你在“解冻”你的数据之前还有其他事情要做,所以I'll point you to this SO question on how to "un-melt" your data


“高效”是指您有一种利用pandas 内置函数的方法,而不是“计算高效”。我对此记忆模糊,但使用.apply(...) 通常是不得已而为之。我想有多种方法可以使用内置函数来解决这个问题,但我发现这个解决方案是最易读的。

【讨论】:

  • 对于第 6 行,Hello i am A,应该是 True
  • 好收获!我刚刚检查过——这个解决方案可以工作,但我使用了他们在问题中给出的数据,其中列出了A 的别名为['AA', 'AA', 'AAA'],因此基于此,Hello i am A 应该评估到False,就像它一样。 :)
  • 你是对的@John。我在customer_df 中错过了这一点。
  • 哇,非常感谢,效果很好。也感谢您的解释和说明,这是我绝对不会想出的方式,对我来说越有价值。
猜你喜欢
  • 2017-03-11
  • 2020-08-18
  • 2021-07-10
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多