我已经为此苦苦挣扎了几天。我在网上阅读了很多文章,发现了一些类似的问题,例如:Pandas counting occurrence of list contained in column of lists 或pandas: count string criteria across down rows,但这些都不完全适用于此情况。
我有两个数据框:df1包含一个字符串列,df2包含一个列表列(列表是来自df1的字符串组合,列表中的每个元素都是唯一的)。
我想知道每种字符串组合在df2的多少个列表中出现。因此,“a”和“b”作为元素出现在多少个列表中?有多少个列表具有"a"和"c"作为元素,以此类推。
下面是df1的简化版本:
df1 = pd.DataFrame({"subject": ["a", "b", "c"]})
df1
subject
0 a
1 b
3 c
这是 df2 的简化版展示。
df2 = pd.DataFrame({"subject_list": [["a", "b" ,"c"], ["b", "c"], ["a", "b"], ["b", "c"], ["c"]]})
df2
subject_list
0 ["a", "b" ,"c"]
1 ["a", "b"]
2 ["b", "c"]
3 ["c"]
4 ["b", "c"]
我有两个代码都能运行,但都不完全正确:
这段代码是在df1中查找两行的组合(如所需)。然而,df1包含的行比df2多,所以它停止在df2的最后一行。但仍然有一些需要测试的“字符串组合”。
df1["combination_0"] = df2["subject_list"].apply(lambda x: x.count(x and df.subject[0]))
这段代码计算了一个“列表”的出现次数。然而,我无法想到如何改变它,让它针对每个值组合进行计算。
df1["list_a_b"] = df2["subject_list"].apply(lambda x: x.count(df1.subject[0] and df1.subject[1]))
df1.list_a_b.sum()
df
和df2
的输出结果(为了易读性)? - cs95df1 = pd.DataFrame({"subject": ["a", "b", "c"]})
,但其他行也存在问题。 - Zev