본문 바로가기

Language/python

[ Python 자료형 ] Dataframe 관리

반응형

출처: https://3months.tistory.com/292 [Deep Play]

Deep Play님의 소중한 글에서 제가 보기편하게 편집하였음.

dataframehan.py
0.00MB

 

0.빈 데이터프레임 생성

df = DataFrame(columns=("c1", "c2", "c3"))

 

1. 데이터프레임 생성(numpy)

my_array = np.array([[1, 2, 3], [4, 5, 6]])
my_df=pd.DataFrame(my_array)

display(my_df)

   0  1  2
0  1  2  3
1  4  5  6

 

1_2. 데이터프레임 생성(list)


my_list =[[1, 2, 3], [4, 5, 6]]
my_df=pd.DataFrame(my_list)

display(my_df)

0 1 2
0 1 2 3
1 4 5 6

2. 데이터프레임 생성(dictionary)

my_dict = {"a": ['1', '3'], "b": ['1', '2'], "c": ['2', '4']}
my_df = pd.DataFrame(my_dict)

display(my_df)

   a  b  c
0  1  1  2
1  3  2  4

3. 데이터프레임 생성(data, index, column을 지정)

my_df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), index= [2.5, 12.6, 4.8], columns=[48, 49, 50])


display(my_df)

      48  49  50
2.5    1   2   3
12.6   4   5   6
4.8    7   8   9

4. 데이터프레임 생성(Series)

my_series = pd.Series({"United Kingdom":"London", "India":"New Delhi", "United States":"Washington", "Belgium":"Brussels"}) # 데이터 프레임의 한컬럼 한컬럼이 시리즈이다.

display(pd.DataFrame(my_series))

                         0
United Kingdom      London
India            New Delhi
United States   Washington
Belgium           Brussels

5. 데이터프레임의 Shape 및 길이 구하기

df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6]]))

display(df.shape)
display(len(df.index))

(2, 3)
2

6. 데이터프레임의 컬럼 및 인덱스 구하기

df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6]]))
a = list(df.columns)
b = list(df.index)

display(a)
display(b)

[0, 1, 2]
[0, 1]

7. 데이터프레임의 행(로우) 인덱싱

df = pd.DataFrame({"A":[1,2,3],"B":['a','d','g'], "C":['b','e','h'], "D":['c','f','i']})
df = df.set_index('A')

display(df)
display(df.iloc[1]) # iloc는 1번째 행을 참조하지만 loc와 ix는 index이름인 1을 참조하여 시리즈를 반환한다.
display(df.loc[1])
display(df.ix[1])

   B  C  D
A         
1  a  b  c
2  d  e  f
3  g  h  i
B    d
C    e
D    f
B    a
C    b
D    c
B    a
C    b
D    c

7_1. 데이터프레임의 행(로우) 인덱싱(컬럼에 where 조건을 걸어)

 

df = pd.DataFrame({"A":[1,2,3],"B":['a','d','g'], "C":['b','e','h'], "D":['c','f','i']})
print(df)
print(df[df.A == 1])

   A  B  C  D
0  1  a  b  c
1  2  d  e  f
2  3  g  h  i
   A  B  C  D
0  1  a  b  c

8. 데이터프레임의 열(컬럼) 인덱싱

df = pd.DataFrame({"A":[1,4,7], "B":[2,5,8], "C":[3,6,9]})

 

display(df)
display(df.loc[:,'A'])
display(df['A'])

   A  B  C
0  1  2  3
1  4  5  6
2  7  8  9
0    1
1    4
2    7
0    1
1    4
2    7

9. 데이터프레임의 로우, 컬럼 인덱싱(특정 값)

df = pd.DataFrame({"A":[1,4,7], "B":[2,5,8], "C":[3,6,9]})

display(df.ix[0]['B'])
display(df.loc[0]['B'])
display(df.iloc[0][1])

2
2
2

10. 데이터프레임의 데이터프레임(잘라서) 반환


df = pd.DataFrame({"A":[1,4,7], "B":[2,5,8], "C":[3,6,9]})

display(df.loc[0:1,:'B'])

   A  B
0  1  2
1  4  5

display(df[['A','C']]) # 복수컬럼을 지정하여 잘라서 데이터프레임으로 반환

   A  C
0  1  3
1  4  6
2  7  9

 


11. 인덱스 설정하기


df = pd.DataFrame({"A":[1,4,7], "B":[2,5,8], "C":[3,6,9]})
display(df)

df = df.set_index('A')
display(df)

   A  B  C
0  1  2  3
1  4  5  6
2  7  8  9
   B  C
A      
1  2  3
4  5  6
7  8  9


12. 로우 추가하기(행지정)


df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), index= [2.5, 12.6, 4.8], columns=[48, 49, 50])
display(df)

df.ix[2] = [60, 50, 40] # There's no index labeled `2`, so you will change the index at position `2`
display(df)

df.loc[2] = [11, 12, 13] # This will make an index labeled `2` and add the new values
display(df)

      48  49  50
2.5    1   2   3
12.6   4   5   6
4.8    7   8   9
      48  49  50
2.5    1   2   3
12.6   4   5   6
4.8   60  50  40
      48  49  50
2.5    1   2   3
12.6   4   5   6
4.8   60  50  40
2.0   11  12  13


13. 로우 추가하기(맨뒤에 - dataframe을 만들어서 추가하는 형태)

df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=[48, 49, 50])
display(df)

a = pd.DataFrame(data=[[1,2,3]], columns=[48,49,50])
display(a)

df = df.append(a)
display(df)

df = df.reset_index(drop=True) # 인덱스를 재배열한다 (이전 인덱스 삭제)
display(df)

   48  49  50
0   1   2   3
1   4   5   6
2   7   8   9
   48  49  50
0   1   2   3
   48  49  50
0   1   2   3
1   4   5   6
2   7   8   9
0   1   2   3
   48  49  50
0   1   2   3
1   4   5   6
2   7   8   9
3   1   2   3


14. 컬럼 추가하기(Series로 부터)

df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=['A', 'B', 'C'])
display(df)

df.loc[:, 'D'] = pd.Series(['5', '6', '7'], index=df.index) # loc함수를 통한 Series추가
display(df)

df['E'] = pd.Series(['5', '6', '7'], index=df.index) # 컬럼명을 지정하여 Series추가
display(df)

   A  B  C
0  1  2  3
1  4  5  6
2  7  8  9
   A  B  C  D
0  1  2  3  5
1  4  5  6  6
2  7  8  9  7
   A  B  C  D  E
0  1  2  3  5  5
1  4  5  6  6  6
2  7  8  9  7  7


14_2. 컬럼 추가하기(단일값)

 

df = pd.DataFrame(np.array([['i1',1,'a',111],['i2',2,'b',222],['i3',3,'c',333]]),columns=['i_col','x1','x2','x3'])
print(df)

df["x4"] = 6
print(df)

i_col x1 x2 x3
0 i1 1 a 111
1 i2 2 b 222
2 i3 3 c 333
i_col x1 x2 x3 x4
0 i1 1 a 111 6
1 i2 2 b 222 6
2 i3 3 c 333 6

14_3 컬럼값 변경

데이터 프레임에서 series를 추출 후 for문을 통해 변환로직을 거쳐 list를 만들어 낸다. 이후 다시 series를 list로 치환한다.

import pandas as pd
from pandas import Series, DataFrame
import numpy as np

data = DataFrame(columns=["dates","val"])
templist = [["2019-01-01",89],["2019-01-02",70]]
for i in range(len(templist)):
data.loc[i] = templist[i]
print(data)
print(type(data.ix[0][0]))

templist=[]
for i in data['dates']:
i= np.datetime64(i)
templist.append(i)

data['dates' ]= templist
print(data)
print(type(data.ix[0][0]))

 

C:\Anaconda3\envs\vfifth\python.exe D:/02_Python/01_workspace/ziplinetest/test.py
        dates val
0  2019-01-01  89
1  2019-01-02  70
<class 'str'>
       dates val
0 2019-01-01  89
1 2019-01-02  70
<class 'pandas._libs.tslib.Timestamp'>

 

15. 열 삭제

df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=['A', 'B', 'C'])
display(df)

df.drop('A', axis=1, inplace=True) # drop axis의 경우 column이면 1, row이면 0이다.
display(df)

   A  B  C
0  1  2  3
1  4  5  6
2  7  8  9
   B  C
0  2  3
1  5  6
2  8  9


16. 중복 로우 삭제

df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [40, 50, 60], [23, 35, 37]]),
index= [2.5, 12.6, 4.8, 4.8, 2.5],
columns=[48, 49, 50])
display(df)

df = df.reset_index() # 인덱스열을 신규로 생성하고 기존 인덱스는 'index'라는 컬럼값을 가진 열로 변경된다.
display(df)

df = df.drop_duplicates(subset='index', keep='last').set_index('index') # 컬럼명이 index인 중복된 로우를 둘다 삭제하고 'index'명을 가진 컬럼을 인덱스로 다시 바꿈
display(df)

      48  49  50
2.5    1   2   3
12.6   4   5   6
4.8    7   8   9
4.8   40  50  60
2.5   23  35  37
   index  48  49  50
0    2.5   1   2   3
1   12.6   4   5   6
2    4.8   7   8   9
3    4.8  40  50  60
4    2.5  23  35  37
       48  49  50
index            
12.6    4   5   6
4.8    40  50  60
2.5    23  35  37


17. 인덱스를 통한 로우 삭제


df = pd.DataFrame(data=np.array([[1, 2, 3], [1, 5, 6], [7, 8, 9]]), columns=['A', 'B', 'C'])
display(df)

print(df.index[1])
df = df.drop(df.index[1])
display(df)

df = pd.DataFrame(data=np.array([[1, 2, 3], [1, 5, 6], [7, 8, 9]]), columns=['A', 'B', 'C'])
df = df.drop(0)
display(df)

   A  B  C
0  1  2  3
1  1  5  6
2  7  8  9
1
   A  B  C
0  1  2  3
2  7  8  9
   A  B  C
1  1  5  6
2  7  8  9


18. 데이터 변경(수정)

df = pd.DataFrame(data=np.array([[1, 2, 3], [1, 5, 6], [7, 8, 9]]), columns=['A', 'B', 'C'])
display(df)

df.iat[0 , 0] = 0
display(df)

   A  B  C
0  1  2  3
1  1  5  6
2  7  8  9
   A  B  C
0  0  2  3
1  1  5  6
2  7  8  9


19. dataframe 출력 컬럼 너비 및 개수 조정

 

pd.set_option('display.max_colwidth', -1) # 출력 컬럼 너비 조정
pd.set_option('display.max_columns', 10) # 출력 컬럼 개수 조정


20. 컬럼 데이터타입 출력 및 변경


df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0],
'C': ['1.1.2010', '2.1.2011', '3.1.2011'],
'D': ['1 days', '2 days', '3 days'],
'E': ['1', '2', '3']})

print(df)
print(df.dtypes) # 컬럼 데이터타입 출력

df['A'] = df['A'].astype('float')

df['B'] = df['B'].astype('int')
print(df)
print(df.dtypes) # 컬럼 데이터타입 출력

A B C D E
0 1 1.0 1.1.2010 1 days 1
1 2 2.0 2.1.2011 2 days 2
2 3 3.0 3.1.2011 3 days 3
A int64
B float64
C object
D object
E object
dtype: object
A B C D E
0 1.0 1 1.1.2010 1 days 1
1 2.0 2 2.1.2011 2 days 2
2 3.0 3 3.1.2011 3 days 3
A float64
B int32
C object
D object
E object
dtype: object

 

21. 데이터프레임에서 NAN 처리


df = pd.DataFrame([[1,np.nan, 2, np.nan],
                          [3,np.nan, 4, np.nan],
                          [5,6, 7, 8],
                          [np.nan, np.nan, np.nan, np.nan]
                          ])
print(df)

# NAN이 포함된 행 삭제하기
df_modify = df.dropna()
print(df_modify)

# NAN을 특정값으로 바꾸기
df_modify = df.fillna(0)
print(df_modify)

0 1 2 3
0 1.0 NaN 2.0 NaN
1 3.0 NaN 4.0 NaN
2 5.0 6.0 7.0 8.0
3 NaN NaN NaN NaN
0 1 2 3
2 5.0 6.0 7.0 8.0
0 1 2 3
0 1.0 0.0 2.0 0.0
1 3.0 0.0 4.0 0.0
2 5.0 6.0 7.0 8.0
3 0.0 0.0 0.0 0.0

22. DataFrame null 체크(empty)

df = pd.DataFrame([[1, 2, 3, 4],
[5, 6, 7, 8]
])

if df.empty != True:
print(df)

df = df.drop(df.index[0])
df = df.drop(df.index[0])

if df.empty == True:
print('empty')

   0  1  2  3
0  1  2  3  4
1  5  6  7  8
empty

23. DataFrame group by

 

df = pd.DataFrame({'group': ['a', 'a', 'a', 'b', 'b', 'b'],
'value_1': np.arange(6),
'value_2': np.random.randn(6)})
print (df)

# group by object 생성
grouped = df.groupby('group')
print(grouped)

resultdf = grouped.sum()
print(resultdf)

resultdf = grouped.count()
print(resultdf)

  group  value_1   value_2
0     a        0 -0.025190
1     a        1 -0.121851
2     a        2 -0.231343
3     b        3  0.125051
4     b        4  0.287052
5     b        5 -0.313823
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0430D790>
       value_1   value_2
group                   
a            3 -0.378384
b           12  0.098281
       value_1  value_2
group                  
a            3        3
b            3        3
반응형

'Language > python' 카테고리의 다른 글

[ Python conda ] conda 가상환경 관리  (0) 2019.12.19
[ Python 자료형 ] numpy 관리  (0) 2019.12.08
[ Python 자료형 ] 집합(Set) 관리  (0) 2019.12.08
[ Python 자료형 ] Dictionary  (0) 2019.12.08
[ Python 자료형 ] Tuple  (0) 2019.12.08