열 값을 기반으로 데이터 프레임에서 행을 선택하려면 어떻게합니까?


질문

 

팬더의 일부 열에있는 값을 기반으로 데이터 프레임에서 행을 선택하려면 어떻게합니까?

SQL에서는 다음과 같이 사용할 것입니다.

SELECT *
FROM table
WHERE column_name = some_value

답변

 

열 값이 스칼라와 동일한 행을 선택하려면 some_value, use == :

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

열 값이 iterable, some_values에있는 행을 선택하려면 iSIN을 사용하십시오.

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

여러 조건을 & :

df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)]

괄호를 기록하십시오.파이썬의 운영자 우선 순위로 인해 <= 및> =보다 더 단단히 바인딩됩니다.따라서 마지막 예제의 괄호가 필요합니다.괄호가 없어

df['column_name'] >= A & df['column_name'] <= B

대로 구문 분석됩니다

df['column_name'] >= (A & df['column_name']) <= B

시리즈의 진리 가치가 발생하는 것은 모호한 오류입니다.


열 값이 Some_Value와 같지 않도록 열을 선택하려면, 사용! = : :

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

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

포함 할 값이 여러 개인 경우 목록 (또는 더 일반적으로), iSIN을 사용하십시오 :

print(df.loc[df['B'].isin(['one','three'])])

수율

     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

그러나 여러 번 이렇게하고 싶다면 더 효율적입니다. 먼저 색인을 만들고 df.loc을 사용하십시오.

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

수율

       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12

또는 인덱스에서 여러 값을 포함하려면 df.index.isin을 사용하십시오.

df.loc[df.index.isin(['one','two'])]

수율

       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


답변

팬더 데이터 프레임에서 행을 선택하는 방법에는 여러 가지가 있습니다.

  1. Boolean indexing (df[df['col'] == value] )
  2. Positional indexing (df.iloc[...])
  3. Label indexing (df.xs(...))
  4. df.query(...) API

아래에서는 특정 기술을 사용할 때 조언과 함께 각각의 예를 보여줍니다.우리의 기준이 'A'== 'Foo'라고 가정합니다.

(성능에 대한 참고 사항 : 각 기본 유형에 대해 Pandas API를 사용하여 일을 간단하게 유지하거나 API 외부에서 벤처 할 수 있습니다. 일반적으로 숫자로 표시되고 속도가 빨라집니다.)

python



답변

TL; 박사

팬더는 해당합니다

select * from table where column_name = some_value

~이다

table[table.column_name == some_value]

여러 조건 :

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

또는

table.query('column_name == some_value | column_name2 == some_value2')

코드 예제

import pandas as pd

# Create data set
d = {'foo':[100, 111, 222],
     'bar':[333, 444, 555]}
df = pd.DataFrame(d)

# Full dataframe:
df

# Shows:
#    bar   foo
# 0  333   100
# 1  444   111
# 2  555   222

# Output only the row(s) in df where foo is 222:
df[df.foo == 222]

# Shows:
#    bar  foo
# 2  555  222

위의 코드에서는이 경우 열 값을 기반으로 행을 제공하는 DF [df.foo == 222] 라인입니다.

여러 조건도 가능합니다.

df[(df.foo == 222) | (df.bar == 444)]
#    bar  foo
# 1  444  111
# 2  555  222

그러나이 시점에서 쿼리 기능을 사용하는 것이 좋습니다.

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


답변

나는 이전 답변의 구문을 중복하고 기억하기가 어렵습니다.팬더는 v0.13의 query () 메소드를 도입했으며, 나는 그것을 많이 선호합니다.귀하의 질문을 위해, 당신은 df.query ( 'col == val')를 할 수 있습니다.

http://pandas.pydata.org/pandas-docs/version/0.17.0/indexing.html#indexing-query에서 재현되었습니다

In [167]: n = 10

In [168]: df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc'))

In [169]: df
Out[169]: 
          a         b         c
0  0.687704  0.582314  0.281645
1  0.250846  0.610021  0.420121
2  0.624328  0.401816  0.932146
3  0.011763  0.022921  0.244186
4  0.590198  0.325680  0.890392
5  0.598892  0.296424  0.007312
6  0.634625  0.803069  0.123872
7  0.924168  0.325076  0.303746
8  0.116822  0.364564  0.454607
9  0.986142  0.751953  0.561512

# pure python
In [170]: df[(df.a < df.b) & (df.b < df.c)]
Out[170]: 
          a         b         c
3  0.011763  0.022921  0.244186
8  0.116822  0.364564  0.454607

# query
In [171]: df.query('(a < b) & (b < c)')
Out[171]: 
          a         b         c
3  0.011763  0.022921  0.244186
8  0.116822  0.364564  0.454607

@를 앞에 붙이면 환경에서 변수에 액세스 할 수도 있습니다.

exclude = ('red', 'orange')
df.query('color not in @exclude')


답변

pandas> query를 사용하여 더 많은 유연성> = 0.25.0 :

팬더> = 0.25.0 이후 우리는 쿼리 방법을 사용하여 팬더 메소드와 공백이있는 열 이름과의 데이터 프레임을 필터링 할 수 있습니다.일반적으로 열 이름의 공백은 오류를 제공하지만 이제는 뒷 테이크를 사용하여 해결할 수 있습니다 (`) - GitHub :

# Example dataframe
df = pd.DataFrame({'Sender email':['ex@example.com', "reply@shop.com", "buy@shop.com"]})

     Sender email
0  ex@example.com
1  reply@shop.com
2    buy@shop.com

str.endswith 메소드로 .query 사용 :

df.query('`Sender email`.str.endswith("@shop.com")')

산출

     Sender email
1  reply@shop.com
2    buy@shop.com

또한 @ 쿼리에서 @를 접두어주는 로컬 변수를 사용할 수 있습니다.

domain = 'shop.com'
df.query('`Sender email`.str.endswith(@domain)')

산출

     Sender email
1  reply@shop.com
2    buy@shop.com


답변

PandaS에서 주어진 값에 대해 여러 열에서 특정 열만 선택하려면 다음을 수행하십시오.

select col_name1, col_name2 from table where column_name = some_value.

옵션 LOC :

df.loc[df['column_name'] == some_value, [col_name1, col_name2]]

또는 쿼리 :

df.query('column_name == some_value')[[col_name1, col_name2]]
출처:https://stackoverflow.com/questions/17071871/how-do-i-select-rows-from-a-dataframe-based-on-column-values