Python 如何基于列值从数据帧中选择行?

Python 如何基于列值从数据帧中选择行?,python,pandas,dataframe,Python,Pandas,Dataframe,如何根据Pandas中某列中的值从数据框中选择行 在SQL中,我将使用: 选择* 从桌子上 其中colume\u name=某个值 我试图查看Pandas的文档,但没有立即找到答案。要选择列值等于标量的行,请使用=: df.loc[df['column_name'] == some_value] 要选择列值在iterable中的行,某些值,请使用isin: df.loc[df['column_name'].isin(some_values)] print(df.loc[df['B'].is

如何根据Pandas中某列中的值从数据框中选择行

在SQL中,我将使用:

选择*
从桌子上
其中colume\u name=某个值

我试图查看Pandas的文档,但没有立即找到答案。

要选择列值等于标量的行,请使用
=

df.loc[df['column_name'] == some_value]

要选择列值在iterable中的行,
某些值
,请使用
isin

df.loc[df['column_name'].isin(some_values)]
print(df.loc[df['B'].isin(['one','three'])])
df.loc[df.index.isin(['one','two'])]
将多个条件与
组合:

df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)]
被解析为

df['column_name'] >= (A & df['column_name']) <= B
isin
返回一个布尔序列,因此要选择其值不在
某些值中的行,请使用
~
对布尔序列求反:

df.loc[~df['column_name'].isin(some_values)]

比如说,

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  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14
       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12
       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12

如果要包含多个值,请将它们放在 列出(或更一般地说,任何iterable)并使用
isin

df.loc[df['column_name'].isin(some_values)]
print(df.loc[df['B'].isin(['one','three'])])
df.loc[df.index.isin(['one','two'])]
屈服

     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  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14
       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12
       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12

但是,请注意,如果您希望多次执行此操作,则 首先制作索引,然后使用
df.loc

df = df.set_index(['B'])
print(df.loc['one'])
屈服

     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  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14
       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12
       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12
或者,要包含索引中的多个值,请使用
df.index.isin

df.loc[df['column_name'].isin(some_values)]
print(df.loc[df['B'].isin(['one','three'])])
df.loc[df.index.isin(['one','two'])]
屈服

     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  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14
       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12
       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12

要选择列值等于标量的行,请使用
=

df.loc[df['column_name'] == some_value]

要选择列值在iterable中的行,
某些值
,请使用
isin

df.loc[df['column_name'].isin(some_values)]
print(df.loc[df['B'].isin(['one','three'])])
df.loc[df.index.isin(['one','two'])]
将多个条件与
组合:

df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)]
被解析为

df['column_name'] >= (A & df['column_name']) <= B
isin
返回一个布尔序列,因此要选择其值不在
某些值中的行,请使用
~
对布尔序列求反:

df.loc[~df['column_name'].isin(some_values)]

比如说,

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  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14
       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12
       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12

如果要包含多个值,请将它们放在 列出(或更一般地说,任何iterable)并使用
isin

df.loc[df['column_name'].isin(some_values)]
print(df.loc[df['B'].isin(['one','three'])])
df.loc[df.index.isin(['one','two'])]
屈服

     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  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14
       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12
       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12

但是,请注意,如果您希望多次执行此操作,则 首先制作索引,然后使用
df.loc

df = df.set_index(['B'])
print(df.loc['one'])
屈服

     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  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14
       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12
       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12
或者,要包含索引中的多个值,请使用
df.index.isin

df.loc[df['column_name'].isin(some_values)]
print(df.loc[df['B'].isin(['one','three'])])
df.loc[df.index.isin(['one','two'])]
屈服

     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  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14
       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12
       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12

下面是一个简单的例子

from pandas import DataFrame

# Create data set
d = {'Revenue':[100,111,222], 
     'Cost':[333,444,555]}
df = DataFrame(d)


# mask = Return True when the value in column "Revenue" is equal to 111
mask = df['Revenue'] == 111

print mask

# Result:
# 0    False
# 1     True
# 2    False
# Name: Revenue, dtype: bool


# Select * FROM df WHERE Revenue = 111
df[mask]

# Result:
#    Cost    Revenue
# 1  444     111

下面是一个简单的例子

from pandas import DataFrame

# Create data set
d = {'Revenue':[100,111,222], 
     'Cost':[333,444,555]}
df = DataFrame(d)


# mask = Return True when the value in column "Revenue" is equal to 111
mask = df['Revenue'] == 111

print mask

# Result:
# 0    False
# 1     True
# 2    False
# Name: Revenue, dtype: bool


# Select * FROM df WHERE Revenue = 111
df[mask]

# Result:
#    Cost    Revenue
# 1  444     111
tl;博士 熊猫相当于

select * from table where column_name = some_value

多个条件:

table[(table.column_name == some_value) | (table.column_name2 == some_value2)]

代码示例 在上面的代码中,
df[df.foo==222]
行根据列值给出行,在这种情况下,
222

也可能出现多种情况:

df[(df.foo == 222) | (df.bar == 444)]
#    bar  foo
# 1  444  111
# 2  555  222
但在这一点上,我建议使用该函数,因为它不会太冗长,并且会产生相同的结果:

df.query('foo == 222 | bar == 444')
tl;博士 熊猫相当于

select * from table where column_name = some_value

多个条件:

table[(table.column_name == some_value) | (table.column_name2 == some_value2)]

代码示例 在上面的代码中,
df[df.foo==222]
行根据列值给出行,在这种情况下,
222

也可能出现多种情况:

df[(df.foo == 222) | (df.bar == 444)]
#    bar  foo
# 1  444  111
# 2  555  222
但在这一点上,我建议使用该函数,因为它不会太冗长,并且会产生相同的结果:

df.query('foo == 222 | bar == 444')

我发现前面答案的语法是多余的,很难记住。Pandas在v0.13中引入了
query()
方法,我更喜欢它。对于您的问题,您可以执行
df.query('col==val')

复制自


我发现前面答案的语法是多余的,很难记住。Pandas在v0.13中引入了
query()
方法,我更喜欢它。对于您的问题,您可以执行
df.query('col==val')

复制自


要附加到这个著名的问题(虽然有点晚了):您还可以执行
df.groupby('column\u name')、get\u group('column\u desired\u value')、reset\u index()
来创建一个具有特定值的指定列的新数据帧。例如

import pandas as pd
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split()})
print("Original dataframe:")
print(df)

b_is_two_dataframe = pd.DataFrame(df.groupby('B').get_group('two').reset_index()).drop('index', axis = 1) 
#NOTE: the final drop is to remove the extra index column returned by groupby object
print('Sub dataframe where B is two:')
print(b_is_two_dataframe)
运行此命令可提供:

Original dataframe:
     A      B
0  foo    one
1  bar    one
2  foo    two
3  bar  three
4  foo    two
5  bar    two
6  foo    one
7  foo  three
Sub dataframe where B is two:
     A    B
0  foo  two
1  foo  two
2  bar  two

要附加到这个著名的问题(虽然有点晚了):您还可以执行
df.groupby('column\u name')、get\u group('column\u desired\u value')、reset\u index()
来创建一个具有特定值的指定列的新数据帧。例如

import pandas as pd
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split()})
print("Original dataframe:")
print(df)

b_is_two_dataframe = pd.DataFrame(df.groupby('B').get_group('two').reset_index()).drop('index', axis = 1) 
#NOTE: the final drop is to remove the extra index column returned by groupby object
print('Sub dataframe where B is two:')
print(b_is_two_dataframe)
运行此命令可提供:

Original dataframe:
     A      B
0  foo    one
1  bar    one
2  foo    two
3  bar  three
4  foo    two
5  bar    two
6  foo    one
7  foo  three
Sub dataframe where B is two:
     A    B
0  foo  two
1  foo  two
2  bar  two

使用以下方法可以获得更快的结果

例如,与-

时间比较:

In [68]: %timeit df.iloc[np.where(df.A.values=='foo')]  # fastest
1000 loops, best of 3: 380 µs per loop

In [69]: %timeit df.loc[df['A'] == 'foo']
1000 loops, best of 3: 745 µs per loop

In [71]: %timeit df.loc[df['A'].isin(['foo'])]
1000 loops, best of 3: 562 µs per loop

In [72]: %timeit df[df.A=='foo']
1000 loops, best of 3: 796 µs per loop

In [74]: %timeit df.query('(A=="foo")')  # slowest
1000 loops, best of 3: 1.71 ms per loop

使用以下方法可以获得更快的结果

例如,与-

时间比较:

In [68]: %timeit df.iloc[np.where(df.A.values=='foo')]  # fastest
1000 loops, best of 3: 380 µs per loop

In [69]: %timeit df.loc[df['A'] == 'foo']
1000 loops, best of 3: 745 µs per loop

In [71]: %timeit df.loc[df['A'].isin(['foo'])]
1000 loops, best of 3: 562 µs per loop

In [72]: %timeit df[df.A=='foo']
1000 loops, best of 3: 796 µs per loop

In [74]: %timeit df.query('(A=="foo")')  # slowest
1000 loops, best of 3: 1.71 ms per loop

有几种方法可以从数据帧中选择行:

  • 布尔索引(
    df[df['col']==value
    ])
  • 位置索引(
    df.iloc[…])
  • 标签索引(
    df.xs(…)
  • df.query(…)
    API
  • 下面我将向您展示每种方法的示例,以及何时使用某些技术的建议。假设我们的标准是列
    'A'
    ==
    'foo'

    (关于性能的注意:对于每种基本类型,我们可以通过使用Pandas API保持简单,或者我们可以在API之外冒险,通常是进入NumPy,并加快速度。)


    设置

    我们首先需要确定一个条件,它将作为我们选择行的标准。我们将从OP的case
    column\u name==some\u value
    开始,并包括一些其他常见用例

    从@unutbu借款:

    import pandas as pd, 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})
    

    1。布尔索引 。。。布尔索引需要找到每行
    'A'
    列的真值等于
    'foo'
    ,然后使用这些真值来标识要保留的行。通常,我们将这个系列命名为真值数组,
    mask
    。我们在这里也会这样做

    mask = df['A'] == 'foo'
    
    然后,我们可以使用此掩码对数据帧进行切片或索引

    df[mask]
    
         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
    
    这是完成这项任务最简单的方法之一,如果性能或直觉不是问题,这应该是您选择的方法。但是,如果性能是一个问题,那么您可能需要考虑创建<代码>掩码< /代码>的另一种方式。