【问题标题】:How to find the values of a column such that no values in another column takes value greater than 3如何查找一列的值,以使另一列中的值不大于 3
【发布时间】:2020-03-01 03:40:13
【问题描述】:

我想找到与一列对应的值,以使另一列中的值不大于 3。

例如,在下面的数据框中

df = pd.DataFrame({'a':[1,2,3,1,2,3,1,2,3], 'b':[4,5,6,4,5,6,4,5,6], 'c':[4,3,5,4,3,5,4,3,3]})

我想要 'a' 列的值,其中所有 'c' 的值都大于 3。

我认为 groupby 是正确的方法。我下面的代码更接近它。

df.groupby('a')['c'].max()>3
a
1     True
2    False
3     True
4    False
Name: c, dtype: bool

上面的代码给了我一个布尔框架。我怎样才能得到 'a' 的值,使其为真。 我希望我的输出是 [1,3]

是否有更好、更有效的方法可以在非常大的数据框(超过 3000 万行)上获取此信息。

【问题讨论】:

  • 你不想要df.a[df.c>3],是吗?
  • 这句话 我想要列 'a' 的值 all 'c' 的值大于 3。不符合 我希望我的输出是 [1,3]
  • 希望你能看到我的回答,我会尽快删除它,因为投票失败
  • 问题不清楚。你声明了一个显然不是你想要的输出。
  • 其他人已经提出了一些好的观点。请澄清您的问题,而不是忽略所有 cmets 并只专注于获得解决方案。

标签: python pandas


【解决方案1】:

从您的代码中,我看到您实际上想要输出:

  • 每个组的组键(dfa 分组),
  • c 列(当前组内)中没有任何值大于 3

为了得到一些非空的结果,我们把源DataFrame改成:

   a  b  c
0  1  4  4
1  2  5  1
2  3  6  5
3  1  4  4
4  2  5  2
5  3  6  5
6  1  4  4
7  2  5  2
8  3  6  3

为了可读性,让我们将 dfa 分组并打印每个组。 代码:

for key, grp in df.groupby('a'):
    print(f'\nGroup: {key}\n{grp}')

给出结果:

Group: 1
   a  b  c
0  1  4  4
3  1  4  4
6  1  4  4

Group: 2
   a  b  c
1  2  5  1
4  2  5  2
7  2  5  2

Group: 3
   a  b  c
2  3  6  5
5  3  6  5
8  3  6  3

现在看看每个组。 只有组 2 满足 c 列中的每个元素 小于3

所以实际上你需要一个 groupbyfilter,只传递组 满足以上条件:

要从“好”组中获取完整行,您可以运行:

df.groupby('a').filter(lambda grp: grp.c.lt(3).all())

得到:

   a  b  c
1  2  5  1
4  2  5  2
7  2  5  2

但您只需要 a 列中的值,而不需要重复。 所以将上面的代码扩展为:

df.groupby('a').filter(lambda grp: grp.c.lt(3).all()).a.unique().tolist()

得到:

[2]

请注意,您的代码:df.groupby('a')['c'].max() > 3 是错误的, 因为它用 True 组标记 max 大于 大于 3 (而不是“>”应该有“

所以另一种解决方案是:

res = df.groupby('a')['c'].max()<3
res[res].index.tolist()

给出相同的结果。

另一个解决方案可以基于列表理解:

[ key for key, grp in df.groupby('a') if grp.c.lt(3).all() ]

详情:

  • for key, grp in df.groupby('a') - 创建群组,
  • if grp.c.lt(3).all() - 过滤组,
  • key(开始时)- 将特定的组键添加到结果中。

【讨论】:

    【解决方案2】:
    import pandas as pd
    
    #Create DataFrame
    df = pd.DataFrame({'a':[1,2,3,1,2,3,1,2,3], 'b':[4,5,6,4,5,6,4,5,6], 'c':[4,3,5,4,3,5,4,3,3]})
    
    #Write a function to find values greater than 3 if found return.
    def grt(x):
       for i in x:
          if i>3:
             return(i)
    
    #Groupby column a and call function grt       
    p = {'c':grt}
    grp = df.groupby(['a']).agg(p)
    print(grp)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      相关资源
      最近更新 更多