首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫删除多级分类数据中没有公共值的行

熊猫删除多级分类数据中没有公共值的行
EN

Stack Overflow用户
提问于 2022-10-27 01:24:52
回答 1查看 61关注 0票数 3

假设我有一只熊猫数据,有三栏:

col1可以是PQ

col2可以是XY

col2可以是ABCD

投入:

代码语言:javascript
复制
   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中的类别中是相等的。

产出:

代码语言:javascript
复制
   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交叉点,但却难以实现。

代码语言:javascript
复制
>>> 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生成聚合的“真值表”。

代码语言:javascript
复制
>>> 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
EN

回答 1

Stack Overflow用户

发布于 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,则表示

  1. 在{col1_value,col2_value}组之间存在"col3“的交点,因为这对组有"X”和"Y“。对于{col1_value、col3_value}对,
  2. 或col2中有相同的"X”或"Y“值的重复。

我假设这种情况不可能发生,因为数据的特性。

,如果可能的话,请通知我,并相应地开发解决方案。

代码语言:javascript
复制
df.groupby(["col3", "col1"]).filter(lambda g: len(g) > 1)    

结果

代码语言:javascript
复制
  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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74215787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档