当前位置: 首页 > 知识库问答 >
问题:

保持数据帧中的行,对于某些列的值的所有组合,这些行在另一列中包含相同的元素

胡桐
2023-03-14
df = pd.DataFrame({'a':['x','x','x','x','x','y','y','y','y','y'],'b':['z','z','z','w','w','z','z','w','w','w'],'c':['c1','c2','c3','c1','c3','c1','c3','c1','c2','c3'],'d':range(1,11)})

   a  b   c   d
0  x  z  c1   1
1  x  z  c2   2
2  x  z  c3   3
3  x  w  c1   4
4  x  w  c3   5
5  y  z  c1   6
6  y  z  c3   7
7  y  w  c1   8
8  y  w  c2   9
9  y  w  c3  10

对于 的所有组合,如何仅保留 中包含相同值的行?或者换句话说,如何排除只有在 的某些组合中才存在的 值的行?

例如,在 (codex,z/code,codex,w/code,codeyz/code,codeyw/code)的所有组合中只有 ,因此输出将为

   a  b   c   d
0  x  z  c1   1
2  x  z  c3   3
3  x  w  c1   4
4  x  w  c3   5
5  y  z  c1   6
6  y  z  c3   7
7  y  w  c1   8
9  y  w  c3  10

共有3个答案

佘辰龙
2023-03-14

让我们尝试透视表,然后删除 ,这意味着组合中缺少一个值:

all_data =(df.pivot(index=['a','b'], columns='c', values='c')
             .loc[:, lambda x: x.notna().all()]
             .columns)
df[df['c'].isin(all_data)]

输出:

   a  b   c   d
0  x  z  c1   1
2  x  z  c3   3
3  x  w  c1   4
4  x  w  c3   5
5  y  z  c1   6
6  y  z  c3   7
7  y  w  c1   8
9  y  w  c3  10
景胜涝
2023-03-14

这里有一个办法。获取每个组的唯一列表,然后使用 检查所有返回数组的公共元素。然后使用 筛选数据框架

from functools import reduce
out = df[df['c'].isin(reduce(np.intersect1d,df.groupby(['a','b'])['c'].unique()))]

细目:

s = df.groupby(['a','b'])['c'].unique()
common_elements = reduce(np.intersect1d,s)
#Returns :-> array(['c1', 'c3'], dtype=object)

out = df[df['c'].isin(common_elements )]#.copy()
   a  b   c   d
0  x  z  c1   1
2  x  z  c3   3
3  x  w  c1   4
4  x  w  c3   5
5  y  z  c1   6
6  y  z  c3   7
7  y  w  c1   8
9  y  w  c3  10
栾越
2023-03-14

让我们使用 尝试 来计数每列 组中的唯一元素:

s = df['a'] + ',' + df['b'] # combination of a, b
m = s.groupby(df['c']).transform('nunique').eq(s.nunique())
df[m]

   a  b   c   d
0  x  z  c1   1
2  x  z  c3   3
3  x  w  c1   4
4  x  w  c3   5
5  y  z  c1   6
6  y  z  c3   7
7  y  w  c1   8
9  y  w  c3  10

 类似资料:
  • 我有两个数据帧,它们共享多个公共列,如下所示: 第一个: 而第二个: 我想保留中的行,其列也存在于中。例如,df2的第27行有值,对于,这些值并不都存在于(因为df1只对列有值

  • 我有一个pandas dataframe,我想在其中求和某些不规则间隔的日期之间的值。举个例子,我有这样的东西: 并且我知道这些总和的截止日期是2021-03-01、2021-03-04、2021-03-05,所以我想要截止日期和直到(但不包括)下一个截止日期产生的所有小部件的总和。所有不是截止日期的日期的值都为0。 这将产生如下所示的新列。 我怎么能在熊猫内部做到这一点呢?

  • 我有一个由66个变量的10299个观测值组成的数据框。其中一些变量共享一个通用的列名,我想计算每个观测值的这些变量的平均值。 具有以下矩阵,列名: 我想得到: 我尝试了循环,命令,但没有得到所需的结果。 抱歉,如果这个问题看起来太基本了,我已经在谷歌上查过可能的解决方案,但没有找到任何解决方案。

  • 我有一个熊猫数据框,看起来像这样: 下面是一个列表: 如何删除熊猫数据帧中包含列表中给定字符串的每一行? 所需的输出应如下所示:

  • 答案的一部分可以在这里找到(如何根据列值从DataFrame中选择行?),但是它只适用于一列。我想知道如何将它应用于多列(本例中为两列)中的成对值。 我有一个数据帧df,其中过滤列是B和C(NaN表示空单元格): 数据目录的代码:

  • 我有以下数据集: 我有以下带有ids的数组: 我想选择 id 属于 id 数组的数据帧 (df) 的列(array_id)。我希望输出是: 我设法实现了执行此操作的代码,但我需要使用两个for(): 输出为: 我想学习一种不需要使用两个for()的方法,并且(df_select)的输出不会与NaN一起出现。有没有办法解决这个问题?

  • 图像中的数据帧 我想将年份(2020年)和上一个第五年(2016年)之间的所有值相加,其中输入PARTNO=输入 因此,对于输入值,我应该得到4 6 2 3 2(2016 2017 2019 2020),即17 请给我一些密码

  • 我想根据某个列变量的不同值从数据框中选择行,并制作直方图。 输出:空数据框列:[年龄、工人阶级、fnlwgt、教育程度、受教育人数、婚姻状况、职业、关系、种族、性别、capitalgain、CapitalAlloss、每周小时数、国家、收入水平]索引:[] 从上面的几行可以看出,我试图选择收入水平为'