假设我有一只熊猫数据,有三栏:
col1可以是P或Q
col2可以是X或Y
col2可以是A、B、C或D
投入:
col1 col2 col3
0 P X B
1 P X D
2 P Y A
3 P Y B
4 P Y D
5 Q X A
6 Q X B
7 Q X C
8 Q X D
9 Q Y A
10 Q Y C我希望输出一个删除行的数据格式,以便对于col1中的每个存储库,col3中的值在col2中的类别中是相等的。
产出:
col1 col2 col3
0 P X B
1 P X D
3 P Y B
4 P Y D
5 Q X A
7 Q X C
9 Q Y A
10 Q Y C我可能把事情搞得太复杂了。但最初的思路是使用groupby,并以某种方式应用set交叉点,但却难以实现。
>>> df.groupby(["col1", "col2"])["col3"].unique()
col1 col2
P X [B, D]
Y [A, B, D]
Q X [A, B, C, D]
Y [A, C]我尝试过的另一种方法是使用pd.crosstab生成聚合的“真值表”。
>>> x = pd.crosstab([df.col1, df.col2], df.col3)
>>> (x>0).groupby(level=0).agg(all)
col3 A B C D
col1
P False True False True
Q True False True False发布于 2022-10-28 05:14:34
该解决方案背后的逻辑是,我们只保留的行( {col1_value,col3_value}对的数目大于1 )。
因此,如果某些{col1_value,col3_value}对的数目等于1,则表示{col1_value、col2_value}组之间没有"col3“的交集,因为对于这个{col1_value,col3_value}对,只有1行具有"X”或"Y“。
否则,如果某些{col1_value,col3_value}对的数目大于1,则表示
我假设这种情况不可能发生,因为数据的特性。
,如果可能的话,请通知我,并相应地开发解决方案。
解
df.groupby(["col3", "col1"]).filter(lambda g: len(g) > 1) 结果
col1 col2 col3
0 P X B
1 P X D
3 P Y B
4 P Y D
5 Q X A
7 Q X C
9 Q Y A
10 Q Y Chttps://stackoverflow.com/questions/74215787
复制相似问题