【问题标题】:Selecting rows from a Dataframe based on values from multiple columns in pandas根据熊猫中多列的值从数据框中选择行
【发布时间】:2018-08-05 09:09:29
【问题描述】:

这个问题非常与another 和thisone 这两个问题相关,我什至会使用这个问题上非常有用的公认解决方案中的示例。以下是已接受解决方案的示例(归功于 unutbu):

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split(),
                   'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
#      A      B  C   D
# 0  foo    one  0   0
# 1  bar    one  1   2
# 2  foo    two  2   4
# 3  bar  three  3   6
# 4  foo    two  4   8
# 5  bar    two  5  10
# 6  foo    one  6  12
# 7  foo  three  7  14

print(df.loc[df['A'] == 'foo'])

产量

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

但我想要 A 的所有行,并且只有 B 中的箭头包含“两个”。我的尝试是尝试

print(df.loc[df['A']) & df['B'] == 'two'])

不幸的是,这不起作用。任何人都可以建议一种方法来实现这样的事情吗?如果解决方案有点笼统,例如列 A 没有相同的值(即 'foo' 但具有不同的值并且您仍然想要整个列),那将有很大帮助。

【问题讨论】:

  • 如果您不想在 A 上进行过滤,那么就不要在此列中包含任何条件。

标签: python pandas


【解决方案1】:

我认为我理解你修改后的问题。在B的条件下分选后,就可以选择你想要的列,如:

In [1]: df.loc[df.B =='two'][['A', 'B']]
Out[1]: 
     A    B
2  foo  two
4  foo  two
5  bar  two

例如,如果我想连接 A 列的所有字符串,其中 B 列的值为 'two',那么我可以这样做:

In [2]: df.loc[df.B =='two'].A.sum()  # <-- use .mean() for your quarterly data
Out[2]: 'foofoobar'

您还可以groupby B 列的值,并从一个表达式中为每个不同的 B 组获得这样的连接结果:

In [3]: df.groupby('B').apply(lambda x: x.A.sum())
Out[3]: 
B
one      foobarfoo
three       barfoo
two      foofoobar
dtype: object

要过滤A 和 B 使用numpy.logical_and:

In [1]: df.loc[np.logical_and(df.A == 'foo', df.B == 'two')]
Out[1]: 
     A    B  C  D
2  foo  two  2  4
4  foo  two  4  8

【讨论】:

  • 对不起,但我编辑了我的要求,我想要整个列 A 而不仅仅是 foo 所以在这种情况下索引为 5 的列也应该包括在内,但它应该假设我没有知道专栏有什么,我只想要它。
  • @AbdulMalekAltawekji 你的问题不清楚。你是什​​么意思你想要“A的整个列”,但“只有B的行中有'两个'”?这两个条件似乎不兼容。
  • 抱歉不清楚。我的意思是我不仅想在 A 列中显示 foo,而且如果在 A 列中也有一个 boo 和一个 gee,并且在 B 列中也有值“二”,我也希望显示它们,但不假设我知道A列也有嘘声和啧啧声。所以只要它在 A 和 B 中它有一个“两个”,我想要它。
  • 所以你的意思是你只想过滤B,然后在过滤后选择A列和B列?我会添加更新。
  • 也许更容易解释我个人想要实现的目标,我有一个包含电影信息的庞大数据集。我有一个名为 midweekGains 的列,其中包含有关电影周中收益的数值。我还有一个名为“季度”的列,它是关于电影出版的那一年的哪个季度,它有 4 个值,1、2、3 和 4,所以我试图计算电影的周中收益的平均值例如在第 1 季度。
【解决方案2】:

行子集:这不是您要找的吗?

df.loc[(df['A'] == 'foo') & (df['B'] == 'two')]

   A   B  C D
2 foo two 2 4
4 foo two 4 8

您还可以在末尾添加.reset_index() 以从零开始初始化索引。

【讨论】:

    【解决方案3】:

    很简单,如果你这样做了

         df[['A','B']][df['B']=='two']
    

    你会得到:

        A    B
    
    2  foo  two
    4  foo  two
    5  bar  two
    

    同时过滤 A 和 B:

        df[['A','B']][(df['B']=='two') & (df['A']=='foo')]
    

    你得到:

            A    B
        2  foo  two
        4  foo  two
    

    如果你想要所有的列:

            df[df['B']=='two']
    

    你会得到:

                A    B  C   D
            2  foo  two  2   4
            4  foo  two  4   8
            5  bar  two  5  10    
    

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 2015-08-15
      相关资源
      最近更新 更多