Pandas 사용법_2

유형우·2021년 12월 6일
0

조건으로 검색하기

df = pd.DataFrame(np.random.rand(5, 2), columns=["A", "B"])
#
          A         B
0  0.793885  0.606616
1  0.102963  0.338295
2  0.216357  0.981374
3  0.905279  0.597836
4  0.802467  0.765217 

1. A컬럼값이 0.5보다 작은지 확인하기
df["A"] < 0.5
#
0    False
1     True
2    False
3     True
4     True

2. A컬럼값이 0.5보다 작은값 가져오기
df[df["A"] < 0.5]
#
          A         B
1  0.279672  0.557540
4  0.149286  0.230602

3. A컬럼값이 0.5보다 작고 B컬럼 값이 0.3보다 큰값
df[(df["A"] < 0.5) & (df["B"] > 0.3)]
#
          A         B
1  0.008060  0.585319
4  0.302785  0.981112

함수로 데이터 처리하기

df = pd.DataFrame(np.arange(5), columns=["Num"])
#
   Num
0    0
1    1
2    2
3    3
4    4 

1. apply로 컬럼에 함수 적용
def square(x):
    return x**2

df["Num"].apply(square)
#
0     0
1     1
2     4
3     9
4    16
Name: Num, dtype: int64

2. apply와 lambda 동시 사용
df["Num"].apply(lambda x : x ** 2)
#
0     0
1     1
2     4
3     9
4    16
Name: Num, dtype: int64

그룹으로 묶기선언 예제

df = pd.DataFrame({
    'key': ['A', 'B', 'C', 'A', 'B', 'C'],
    'data1': [1, 2, 3, 1, 2, 3],
    'data2': [4, 4, 6, 0, 6, 1]
})
#
  key  data1  data2
0   A      1      4
1   B      2      4
2   C      3      6
3   A      1      0
4   B      2      6
5   C      3      1 

그룹으로 묶기1 (groupby)

1. 묶기선언
df.groupby('key')
#
<pandas.core.groupby.groupby.DataFrameGroupBy object at 0x7f7fad25d320>

2. 묶은후 key기준으로 합계구하기
df.groupby('key').sum()
#
     data1  data2
key              
A        2      4
B        4     10
C        6      7

3. 묶은후 key와 data1기준으로 묶기
df.groupby(['key','data1']).sum()
#
           data2
key data1       
A   1          4
B   2         10
C   3          7

그룹으로 묶기2 (aggregate)

1. 'key' 칼럼으로 묶고, data1과 data2 각각의 최솟값, 중앙값, 최댓값을 출력
df.groupby('key').aggregate([min, np.median, max])
#
    data1            data2           
      min median max   min median max
key                                  
A       0    1.5   3     0    2.0   4
B       1    2.5   4     4    5.0   6
C       2    3.5   5     1    3.5   6

2. 'key' 칼럼으로 묶고, data1의 최솟값, data2의 합계를 출력
df.groupby('key').aggregate({'data1': min, 'data2': np.sum})
#
     data1  data2
key              
A        0      4
B        1     10
C        2      7

그룹으로 묶기3 (filter, applying)

1. key별 data2의 평균이 3이 넘는 인덱스만 출력
df.groupby('key').filter(lambda x : x['data2'].mean() > 3)
#
  key  data1  data2
1   B      1      4
2   C      2      6
4   B      4      6
5   C      5      1

2. 최댓값에서 최솟값을 뺀 값을 적용
df.groupby('key').apply(lambda x : x.max() - x.min())
#
     data1  data2
key              
A        3      4
B        3      2
C        3      5

계층구조 만들기

1. 인덱스 계층구조
df1 = pd.DataFrame(
    np.random.randn(4, 2), 
    index=[['A', 'A', 'B', 'B'], [1, 2, 1, 2]],
    columns=['data1', 'data2']
)
#
        data1     data2
A 1 -0.825256 -0.237362
  2  0.509839  0.323999
B 1  0.402725  1.093112
  2  0.377672  0.594508 


2. 컬럼 계층구조
df2 = pd.DataFrame(
    np.random.randn(4, 4),
    columns=[["A", "A", "B", "B"], ["1", "2", "1", "2"]]
)
#
          A                   B          
          1         2         1         2
0 -0.702566  1.203842  0.195728  0.856684
1  0.615197 -0.610520 -0.594851  0.659805
2 -0.613920 -0.435007  0.396825 -0.927077
3  0.152187  0.392888  1.287877 -0.394304 


3. 명시적 인덱싱을 활용한 df1의 인덱스 출력
df1.loc['A', 1]
#
data1   -0.825256
data2   -0.237362


4. df2의 [A][1] 칼럼 출력
df2["A"]["1"]
#
0   -0.702566
1    0.615197
2   -0.613920
3    0.152187

pivot_table 만들기

1. 데이터 프레임 정보 가져오기
df = pd.read_csv("./data/the_pied_piper_of_hamelin.csv")
#
     일차   구분         이름 나이    성별
0     1    Rat       Stevne   3    Male
1     1    Rat  Christopher   3    Male
2     1    Rat      Barbare   1  Female
3     1    Rat        Marie   1  Female
....

2. 데이터끼리 묶기
df2 = df.pivot_table(index="일차", columns="성별", values="나이", aggfunc=np.mean)
-> 
index는 일차별로 묶고, 
columns은 성별별로 묶고, 
values는 나이를 기준으로 aggfunc를 통해 np.mean(평균값)으로 묶는다.

#
성별    Female      Male
일차                    
1   1.000000  3.000000
2   1.666667  1.875000
3   3.500000  2.250000
4   2.837838  2.448276
5   2.897727  2.731959
6   5.761194  4.557377

0개의 댓글