[Python] Dataframe λ³ν©
λ°μ΄ν°νλ μ λ³ν©
λ°μ΄ν° μ μ²λ¦¬ μμ μ μ§ννλ€λ³΄λ©΄ λ°μ΄ν°νλ μμ μ¬λ¬κ°λ‘ λλκ³ λλ€μ νλλ‘ ν©μΉλ λ±μ κ²½μ°κ° λ°μνλ€. μ΄λ² ν¬μ€ν μ μ΄λ¬ν κ²½μ° μ¬μ©ν μ μλ λ°μ΄ν°νλ μ λ³ν© λ©μλμ λν΄μ λ€λ£¨μ΄λ³΄μ.
pd.concat()
concatμ΄λΌλ ν¨μλͺ μμλ μ μ μλ―μ΄ concat ν¨μλ λ°μ΄ν°νλ μμ μ°κ²°μμΌμ£Όλ ν¨μμ΄λ€.
λ¨Όμ λ³ν©μ μν λ°μ΄ν°νλ μμ λκ° μμ±ν΄λ³΄μ
In [5]:
import pandas as pd
df1 = pd.DataFrame({'a':['a0','a1','a2','a3'],
'b':['b0','b1','b2','b3'],
'c':['c0','c1','c2','c3']},
index = [0,1,2,3])
df2 = pd.DataFrame({'a':['a2','a3','a4','a5'],
'b':['b2','b3','b4','b5'],
'c':['c2','c3','c4','c5'],
'd':['d2','d3','d4','d5']},
index = [2,3,4,5])
print(df1,'\n\n', df2)
a b c
0 a0 b0 c0
1 a1 b1 c1
2 a2 b2 c2
3 a3 b3 c3
a b c d
2 a2 b2 c2 d2
3 a3 b3 c3 d3
4 a4 b4 c4 d4
5 a5 b5 c5 d5
μμ λ λ°μ΄ν°νλ μμ μ΄ν΄λ³΄λ©΄ ν indexλͺ κ³Ό 컬λΌλͺ μ΄ λ€λ₯΄λ€. μ΄λλ‘ pd.concat() ν¨μλ₯Ό μ¬μ©νλ©΄ μ΄λ»κ² λλμ§ μ΄ν΄λ³΄μ.
pd.concat() μ λ€μ΄κ°λ μΈμκ°μΌλ‘λ 리μ€νΈλ₯Ό λ°λλ€λ μ μ κΈ°μ΅νμ
pd.concat([df1, df2]) # axis=0 λν΄νΈ
μλ¬΄λ° μ΅μ μμ΄ ν μΈλ±μ€μ μ΄ μΈλ±μ€κ° μλ‘ λ€λ₯Έ λ λ°μ΄ν°νλ μμ λ³ν©νλ κ²½μ° μμ κ°μ΄ λ³ν©λκΈ° μ μμ μ μΈλ±μ€λ₯Ό κ·Έλλ‘ μ¬μ©νκ³ μ΄ μΈλ±μ€κ° λ§μ§ μλ λΆλΆμ NaN κ°μΌλ‘ μ±μμ§λ€.
μ΄ λ ν μΈλ±μ€λ₯Ό μ¬λ°°μ΄νκΈ° μν μ΅μ μΌλ‘ ignore_index=Trueλ₯Ό μ§μ ν μ μλ€.
In [13]:
result = pd.concat([df1, df2], ignore_index=True)
result
nullκ°μ fillna λ©μλλ₯Ό ν΅ν΄ μ²λ¦¬ κ°λ₯νλ€.
result.fillna(0)
μ΄λ²μλ axis=1λ‘ μ§μ ν΄μ μ΄λ°©ν₯μΌλ‘ λ λ°μ΄ν°νλ μμ λ³ν©ν΄λ³΄μ. μ¬μ€μ λ°μ΄ν°νλ μμ κ°λ‘λ‘ λΆμ΄λ κ²½μ°λ κ±°μ μκΈ° λλ¬Έμ λν΄νΈ κ°μ νλ°©ν₯μ κ°λλ€.
pd.concat([df1, df2], axis=1)
μ΄λ°©ν₯μΌλ‘ axisλ₯Ό μ§μ νκ³ λ λ°μ΄ν°νλ μμ λ³ν©ν κ²°κ³Ό ν μΈλ±μ€μ μ΄ μΈλ±μ€κ° λ§μ§ μλ λΆλΆμ λν΄μ null κ°μ λ°ννλ€.
λ§μ½ λ nullκ°μ μ μΈν κ΅μ§ν©μ λ§λ€κ³ μΆλ€λ©΄ join μ΅μ μ innerλ‘ μ§μ νλ€.
pd.concat([df1, df2], axis=1, join='inner')
pd.concat ν¨μμ join μ΅μ μ λν΄νΈλ‘ outer joinμ μννλ€. λ°λΌμ μμ κ°μ΄ null κ°μ΄ λ°νλμλ κ²μ΄κ³ inner joinμ μννλ©΄ nullκ°μ μ μΈν κ΅μ§ν©λ§μ λ°ννλ€.
Series λ°μ΄ν°μ DataFrameμ λ³ν©
Pandasμ DataFrameμ Seriesμ μ§ν©μ΄λ€. λ°λΌμ Seriesλ₯Ό DataFrameμ λ³ν©νλ κ² λν κ°λ₯νλ° μ΄ λ Sereisλ νλμ 컬λΌμ΄λΌκ³ μ΄ν΄νλ©΄ λλ€.
μλμ μμλ s1μ΄λΌλ μ΄ μΈλ±μ€(컬λΌλͺ )μ κ°μ§ Sereis κ°μ²΄λ₯Ό df1μ λ³ν©νλ μμμ΄λ€.
In [20]:
s1 = pd.Series(['s0', 's1', 's2', 's4'], name='s1')
pd.concat([df1, s1], axis=1) # κ²°κ³Όμ μΌλ‘ 컬λΌμ λΆμ΄λ κ²μ΄κΈ° λλ¬Έμ axis=1λ‘ μ§μ
Seriesκ°μ λ³ν©
pd.concat ν¨μλ₯Ό μ΄μ©ν΄ Seriesκ°μ λ³ν© λν κ°λ₯νλ€.
In [27]:
s1 = pd.Series(['a0', 'b1', 'c2', 'd4'], name='s1')
s2 = pd.Series(['e0', 'f1', 'g2', 'h4'], name='s2')
print(pd.concat([s1, s2], axis=0, ignore_index=True))
print('\n\n')
print(pd.concat([s1, s2], axis=1))
0 a0
1 b1
2 c2
3 d4
4 e0
5 f1
6 g2
7 h4
dtype: object
s1 s2
0 a0 e0
1 b1 f1
2 c2 g2
3 d4 h4
μμ Seriesμ λ³ν©μ λν΄ μ΄ν΄λ³΄μλ―μ΄ μ¬μ€μ Seriesμ λ³ν©μ μΆκ°μ κ°λ μ λ κ°κΉλ€κ³ λ³Ό μ μλ€.
pd.merge()
merge() ν¨μλ λ λ°μ΄ν°νλ μμ λ³ν©νλ κΈ°λ₯μ μννλ€λ μ μμ pd.concat()ν¨μμ λμΌνλ€.
νμ§λ§ merge() ν¨μλ λ³ν©νκ³ μ νλ λ λ°μ΄ν°νλ μμ κ³ μ κ°(key)λ₯Ό κΈ°μ€μΌλ‘ λ³ν©ν λ μ¬μ©νλ€λ μ μμ μ°¨μ΄κ° μλ€.
In [39]:
df1 = pd.DataFrame({
'data1':range(6),
'key':list('aabbcc')
})
df2 = pd.DataFrame({
'data2':range(3),
'key':list('cad')
})
print(df1, '\n\n', df2)
data1 key
0 0 a
1 1 a
2 2 b
3 3 b
4 4 c
5 5 c
data2 key
0 0 c
1 1 a
2 2 d
λ¨Όμ λ λ°μ΄ν°νλ μμ ꡬμ±λΆν° μ΄ν΄λ³΄μ df1μ 6κ°μ νμ κ°μ§κ³ μκ³ μ€λ³΅λλ key 컬λΌμ κ°λ€μ κ°μ§κ³ μλ€.
κ·Έλ¦¬κ³ df2λ 3κ°μ νκ³Ό κ³ μ ν key 컬λΌμ κ°λ€μ κ°μ§κ³ μλ€.
pd.merge() ν¨μλ λ λ°μ΄ν°νλ μμ μ‘΄μ¬νλ κ³ μ κ°μ κΈ°μ€μΌλ‘ λ³ν©νλ€κ³ μ€λͺ νλ€. μ΄ κ²½μ° λ λ°μ΄ν°νλ μμμ 곡ν΅μ μΌλ‘ κ°μ§κ³ μλ κ³ μ ν ν€ κ°μ key 컬λΌμ κ°λ€μ΄ λλ€.
λ¨Όμ μλ¬΄λ° μ΅μ μ μ§μ νμ§ μκ³ merge ν¨μλ₯Ό μ¬μ©ν΄λ³΄μ.
merge ν¨μμ λν΄νΈ μ΅μ μ κ³΅ν΅ μ΄μ΄λ¦μ κΈ°μ€μΌλ‘ inner joinμ μννλ€.
merge(how='inner')
In [40]:
pd.merge(df1, df2)
μμ κ²°κ³Όλ₯Ό νμΈνλ©΄ inner joinμΌλ‘ 곡ν΅λ μ΄ μ΄λ¦(key)μ κΈ°μ€μΌλ‘ data2μ κ°λ€μ΄ μ€λ³΅λμ ν©μ³μ§κ³ 곡ν΅λμ§ μλ keyκ° dμ λν΄μ 곡ν΅λλ κ°μ΄ μμ΄ μλ΅λλ€.
μ΄λ²μλ merge ν¨μμ outer joinμ μνν΄λ³΄μ
merge(how='outer')
In [41]:
pd.merge(df1, df2, on='key', how='outer')
outer joinμ μννλ©΄ 곡ν΅λμ§ μλ κ°λ€μ λν΄ NaN κ°μ λ°ννλ€.
merge(how='left')
In [43]:
pd.merge(df1, df2, on='key', how='left')
left joinμ μννλ©΄ df1λ₯Ό κΈ°μ€μΌλ‘ joinμ μννμ¬ df2μ ν΄λΉ key κ°μ΄ μλ κ²½μ°NaN κ°μ λ°ννλ€.
merge(how='right')
In [44]:
pd.merge(df1, df2, on='key', how='right')
right joinμ μννλ©΄ left joinκ³Ό λ°λλ‘ df1μ ν΄λΉ key κ°μ΄ μλ κ²½μ° NaNκ°μ λ°ννλ€.
left_on & right_on
how μ΅μ μ μ΄μ©ν΄ μ¬λ¬ joinμ μ΄μ©ν μ μλλ° μΆκ°μ μΌλ‘ left_onκ³Ό right_on μ΅μ μ μ΄μ©ν΄μ μΌμͺ½ DFμ ν€κ°κ³Ό μ€λ₯Έμͺ½ DFμ ν€κ°μ΄ κ°μ κ²λ€ λΌλ¦¬ m * n μ‘°ν©μΌλ‘ λ°μ΄ν°νλ μ λ³ν©μ΄ κ°λ₯νλ€.
μμλ₯Ό ν΅ν΄ μ΄λ»κ² λ°μ΄ν°νλ μ λ³ν©μ΄ κ°λ₯νμ§ μμ보μ
In [46]:
df1 = pd.DataFrame({
'data1' : range(7),
'lkey' : list('abcabca')
})
df2 = pd.DataFrame({
'data2' : range(3),
'rkey' : list('abd')
})
In [47]:
pd.merge(df1, df2, left_on='lkey', right_on='rkey')
μ κ²°κ³Όλ₯Ό νμΈν΄λ³΄λ©΄ λ λ°μ΄ν°νλ μμ key κ°μ΄ κ°μ§ μμ§λ§ left_onκ³Ό right_on μ΅μ μ μ΄μ©ν΄ key κ°μ μ§μ ν κ²μ νμΈν μ μλ€. μΆκ°μ μΌλ‘ merge ν¨μμ how μ΅μ μ inner joinμ΄ λν΄νΈμ΄κΈ° λλ¬Έμ μμ κ°μ κ²°κ³Όκ° λ°νλκ²μ΄λ€.
join()
join ν¨μλ merge() ν¨μλ₯Ό κΈ°λ°μΌλ‘ λ§λ€μ΄μ‘μΌλ©° μλλ°©μμ΄ λΉμ·νμ§λ§ ν μΈλ±μ€λ₯Ό κΈ°μ€μΌλ‘ λ°μ΄ν°νλ μμ λ³ν©νλ€λ μ μμ μ°¨μ΄κ° μλ€.
In [54]:
df1 = pd.DataFrame({
'data1' : range(7),
'lkey' : list('abcabca'),
}, index = range(7))
df2 = pd.DataFrame({
'data2' : range(3),
'rkey' : list('abd')
}, index = [2, 3, 4])
In [55]:
df1.join(df2)
join ν¨μλ λν΄νΈκ°μΌλ‘ left joinμ μννκΈ° λλ¬Έμ μμ κ°μ κ²°κ³Όλ₯Ό νμΈν μ μλ€.
λ³ν© κΈ°μ€ μμ ν μΈλ±μ€λ₯Ό κΈ°λ°μΌλ‘ λ³ν©μ΄ μνλμλ€.