[PYTHON] Python Pandas 조건부 합계
PYTHONPython Pandas 조건부 합계
샘플 데이터 사용 :
df = pd.DataFrame({'key1' : ['a','a','b','b','a'],
'key2' : ['one', 'two', 'one', 'two', 'one'],
'data1' : np.random.randn(5),
'data2' : np. random.randn(5)})
df
data1 data2 key1 key2
0 0.361601 0.375297 a one
1 0.069889 0.809772 a two
2 1.468194 0.272929 b one
3 -1.138458 0.865060 b two
4 -0.268210 1.250340 a one
key2로 데이터를 그룹화하고 key2가 'one'과 동일한 data1 값만 합하는 방법을 찾으려고합니다.
여기 내가 시도한 것이있다.
def f(d,a,b):
d.ix[d[a] == b, 'data1'].sum()
df.groupby(['key1']).apply(f, a = 'key2', b = 'one').reset_index()
하지만 이것은 '없음'값을 가진 데이터 프레임을 제공합니다.
index key1 0
0 a None
1 b None
어떤 아이디어가 있습니까? 나는 다음과 같은 SQL에 해당하는 Pandas를 찾고있다.
SELECT Key1, SUM(CASE WHEN Key2 = 'one' then data1 else 0 end)
FROM df
GROUP BY key1
참고 - 팬더 집계에 대한 조건부 합계를 보았지만 거기 제공된 answer를 변형하지 않고 합계를 계산할 수는 없습니다.
미리 감사드립니다.
해결법
-
==============================
1.첫 번째 groupby는 key1 열입니다.
첫 번째 groupby는 key1 열입니다.
In [11]: g = df.groupby('key1')
각 그룹에 대해 key2가 'one'과 같은 subDataFrame을 가져 와서 data1 열을 합합니다.
In [12]: g.apply(lambda x: x[x['key2'] == 'one']['data1'].sum()) Out[12]: key1 a 0.093391 b 1.468194 dtype: float64
진행 상황을 설명하기 위해 'a'그룹을 살펴 보겠습니다.
In [21]: a = g.get_group('a') In [22]: a Out[22]: data1 data2 key1 key2 0 0.361601 0.375297 a one 1 0.069889 0.809772 a two 4 -0.268210 1.250340 a one In [23]: a[a['key2'] == 'one'] Out[23]: data1 data2 key1 key2 0 0.361601 0.375297 a one 4 -0.268210 1.250340 a one In [24]: a[a['key2'] == 'one']['data1'] Out[24]: 0 0.361601 4 -0.268210 Name: data1, dtype: float64 In [25]: a[a['key2'] == 'one']['data1'].sum() Out[25]: 0.093391000000000002
데이터 프레임을 key2가 첫 번째와 동일한 것으로 제한함으로써 약간 더 쉽고 명확해질 수 있습니다 :
In [31]: df1 = df[df['key2'] == 'one'] In [32]: df1 Out[32]: data1 data2 key1 key2 0 0.361601 0.375297 a one 2 1.468194 0.272929 b one 4 -0.268210 1.250340 a one In [33]: df1.groupby('key1')['data1'].sum() Out[33]: key1 a 0.093391 b 1.468194 Name: data1, dtype: float64
-
==============================
2.오늘 팬더 0.23을 사용하면 다음과 같이 할 수 있다고 생각합니다.
오늘 팬더 0.23을 사용하면 다음과 같이 할 수 있다고 생각합니다.
import numpy as np df.assign(result = np.where(df['key2']=='one',df.data1,0))\ .groupby('key1').agg({'result':sum})
이 이점은 동일한 데이터 프레임의 둘 이상의 열에 적용 할 수 있다는 것입니다
df.assign( result1 = np.where(df['key2']=='one',df.data1,0), result2 = np.where(df['key2']=='two',df.data1,0) ).groupby('key1').agg({'result1':sum, 'result2':sum})
from https://stackoverflow.com/questions/17266129/python-pandas-conditional-sums by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 이진 문자열에서 16 진수로 파이썬 변환 (0) | 2018.11.25 |
---|---|
[PYTHON] Python과 Selenium 요소 WebElement 객체에서 텍스트를 가져 오는 방법은 무엇입니까? (0) | 2018.11.25 |
[PYTHON] 텍스트 파일에서 numpy 배열로 데이터 읽기 (0) | 2018.11.25 |
[PYTHON] iterable을 스트림으로 변환하는 방법? (0) | 2018.11.25 |
[PYTHON] 파이썬에서 길이 인코딩 실행 (0) | 2018.11.25 |