열 값을 기반으로 데이터 프레임에서 행을 선택하려면 어떻게합니까?
질문
팬더의 일부 열에있는 값을 기반으로 데이터 프레임에서 행을 선택하려면 어떻게합니까?
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
답변
팬더 데이터 프레임에서 행을 선택하는 방법에는 여러 가지가 있습니다.
- Boolean indexing (
df[df['col'] == value
] ) - Positional indexing (
df.iloc[...]
) - Label indexing (
df.xs(...)
) df.query(...)
API
아래에서는 특정 기술을 사용할 때 조언과 함께 각각의 예를 보여줍니다.우리의 기준이 'A'== 'Foo'라고 가정합니다.
(성능에 대한 참고 사항 : 각 기본 유형에 대해 Pandas API를 사용하여 일을 간단하게 유지하거나 API 외부에서 벤처 할 수 있습니다. 일반적으로 숫자로 표시되고 속도가 빨라집니다.)

답변
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
최근댓글