팬더에서 복잡한 기준으로 선택
예를 들어 간단한 DF가 있습니다.
import pandas as pd
from random import randint
df = pd.DataFrame({'A': [randint(1, 9) for x in xrange(10)],
'B': [randint(1, 9)*10 for x in xrange(10)],
'C': [randint(1, 9)*100 for x in xrange(10)]})
'A'에서 'B'에 해당하는 값이 50보다 크고 'C'에 대해-팬더의 방법과 관용구를 사용하여 900이 아닌 값을 선택할 수 있습니까?
확실한! 설정:
>>> import pandas as pd
>>> from random import randint
>>> df = pd.DataFrame({'A': [randint(1, 9) for x in range(10)],
'B': [randint(1, 9)*10 for x in range(10)],
'C': [randint(1, 9)*100 for x in range(10)]})
>>> df
A B C
0 9 40 300
1 9 70 700
2 5 70 900
3 8 80 900
4 7 50 200
5 9 30 900
6 2 80 700
7 2 80 400
8 5 80 300
9 7 70 800
열 연산을 적용하고 부울 시리즈 객체를 얻을 수 있습니다.
>>> df["B"] > 50
0 False
1 True
2 True
3 True
4 False
5 False
6 True
7 True
8 True
9 True
Name: B
>>> (df["B"] > 50) & (df["C"] == 900)
0 False
1 False
2 True
3 True
4 False
5 False
6 False
7 False
8 False
9 False
[업데이트, 새 스타일로 전환 .loc
] :
그런 다음이를 사용하여 객체를 색인 할 수 있습니다. 읽기 액세스를 위해 다음과 같은 인덱스를 연결할 수 있습니다.
>>> df["A"][(df["B"] > 50) & (df["C"] == 900)]
2 5
3 8
Name: A, dtype: int64
그러나 쓰기 액세스를 위해이 작업을 수행하는 뷰와 사본의 차이로 인해 문제가 발생할 수 있습니다. .loc
대신 사용할 수 있습니다 .
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"]
2 5
3 8
Name: A, dtype: int64
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"].values
array([5, 8], dtype=int64)
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"] *= 1000
>>> df
A B C
0 9 40 300
1 9 70 700
2 5000 70 900
3 8000 80 900
4 7 50 200
5 9 30 900
6 2 80 700
7 2 80 400
8 5 80 300
9 7 70 800
실수로 입력 == 900
하지 않았 != 900
거나 ~(df["C"] == 900)
, 또는 문제가 해결 되지 않았습니다 . 독자를위한 운동. : ^)
Another solution is to use the query method:
import pandas as pd
from random import randint
df = pd.DataFrame({'A': [randint(1, 9) for x in xrange(10)],
'B': [randint(1, 9) * 10 for x in xrange(10)],
'C': [randint(1, 9) * 100 for x in xrange(10)]})
print df
A B C
0 7 20 300
1 7 80 700
2 4 90 100
3 4 30 900
4 7 80 200
5 7 60 800
6 3 80 900
7 9 40 100
8 6 40 100
9 3 10 600
print df.query('B > 50 and C != 900')
A B C
1 7 80 700
2 4 90 100
4 7 80 200
5 7 60 800
Now if you want to change the returned values in column A you can save their index:
my_query_index = df.query('B > 50 & C != 900').index
....and use .iloc
to change them i.e:
df.iloc[my_query_index, 0] = 5000
print df
A B C
0 7 20 300
1 5000 80 700
2 5000 90 100
3 4 30 900
4 5000 80 200
5 5000 60 800
6 3 80 900
7 9 40 100
8 6 40 100
9 3 10 600
And remember to use parenthesis!
Keep in mind that &
operator takes a precedence over operators such as >
or <
etc. That is why
4 < 5 & 6 > 4
evaluates to False
. Therefore if you're using pd.loc
, you need to put brackets around your logical statements, otherwise you get an error. That's why do:
df.loc[(df['A'] > 10) & (df['B'] < 15)]
instead of
df.loc[df['A'] > 10 & df['B'] < 15]
which would result in
TypeError: cannot compare a dtyped [float64] array with a scalar of type [bool]
You can use pandas it has some built in functions for comparison. So if you want to select values of "A" that are met by the conditions of "B" and "C" (assuming you want back a DataFrame pandas object)
df[['A']][df.B.gt(50) & df.C.ne(900)]
df[['A']]
will give you back column A in DataFrame format.
pandas 'gt' function will return the positions of column B that are greater than 50 and 'ne' will return the positions not equal to 900.
참고URL : https://stackoverflow.com/questions/15315452/selecting-with-complex-criteria-from-pandas-dataframe
'development' 카테고리의 다른 글
C ++ 11에서 어떤 C ++ 숙어가 더 이상 사용되지 않습니까? (0) | 2020.05.13 |
---|---|
Eloquent로 "null이 아닌 경우"를 어떻게 확인합니까? (0) | 2020.05.13 |
자바“가상 머신”과 파이썬“인터프리터”의 용어? (0) | 2020.05.13 |
빌드 오류 : System.Runtime에 대한 참조를 추가해야합니다 (0) | 2020.05.13 |
curl : (60) SSL 인증서 : 로컬 발급자 인증서를 가져올 수 없습니다 (0) | 2020.05.13 |