Pandas에서 데이터프레임의 열(column)의 데이터 타입을 변경하는 방법은 아래와 같습니다.
- astype() 메서드 사용
- astype() 메서드는 데이터프레임 내의 모든 값을 지정한 데이터 타입으로 변환합니다.
- 예시: df['column_name'] = df['column_name'].astype('int')
- to_numeric() 메서드 사용
- to_numeric() 메서드는 데이터프레임 열의 값을 수치형으로 변환합니다.
- 예시: df['column_name'] = pd.to_numeric(df['column_name'], errors='coerce')
- to_datetime() 메서드 사용
- to_datetime() 메서드는 데이터프레임 열의 값을 날짜/시간형으로 변환합니다.
- 예시: df['column_name'] = pd.to_datetime(df['column_name'], format='%Y-%m-%d')
- apply() 함수 사용
- apply() 함수는 데이터프레임 열의 각 값을 특정 함수에 적용하여 변환합니다.
- 예시: df['column_name'] = df['column_name'].apply(lambda x: x.lower())
개인적으로 적합한 방법을 선택하여 데이터프레임 열의 데이터 타입을 변경할 수 있습니다.
각 케이스별 구체적인 예는 아래와 같습니다.
1. astype()
import pandas as pd
data = {'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'age': ['23', '35', '27', '29', '31'],
'score': [80, 90, 75, 85, 95]}
df = pd.DataFrame(data)
문자열로 된 'age'열이 포함된 데이터프레임이 있다고 가정해봅시다. 여기서 'age'열의 데이터 타입을 정수형으로 변경하려면 다음과 같이 astype() 메서드를 사용할 수 있습니다.
df['age'] = df['age'].astype(int)
위 코드에서 df['age']는 'age'열에 해당하는 시리즈(Series) 객체를 반환하고, astype(int)는 해당 시리즈의 모든 값들을 정수형으로 변환한 후 다시 시리즈 객체를 반환합니다. 마지막으로 이 값을 다시 'age'열에 대입하여 'age'열의 데이터 타입을 정수형으로 변경합니다.
2. to_numeric()
data = {'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'age': [23, 35, 27, 29, 31],
'score': ['80', '90', '75', '85', '95']}
df = pd.DataFrame(data)
문자열로 된 'score'열이 포함된 데이터프레임이 있다고 가정해봅시다.여기서 'score'열의 데이터 타입을 정수형으로 변경하려면 다음과 같이 to_numeric() 메서드를 사용할 수 있습니다.
df['score'] = pd.to_numeric(df['score'])
위 코드에서 pd.to_numeric(df['score'])는 'score'열의 모든 값을 수치형으로 변환한 후 시리즈 객체를 반환합니다. 이 값을 다시 'score'열에 대입하여 'score'열의 데이터 타입을 수치형으로 변경합니다. 만약 'score'열에 수치형이 아닌 값이 있으면 해당 값은 NaN(Not a Number)으로 변경됩니다. 이때 to_numeric() 메서드의 errors 매개변수를 'coerce'로 지정하면 수치형으로 변환할 수 없는 값을 NaN으로 변환할 수 있습니다. 예를 들어 다음과 같이 사용할 수 있습니다.
df['score'] = pd.to_numeric(df['score'], errors='coerce')
3. to_datetime()
data = {'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'age': [23, 35, 27, 29, 31],
'date': ['2022-04-20', '2022-04-21', '2022-04-22', '2022-04-23', '2022-04-24']}
df = pd.DataFrame(data)
문자열로 된 'date'열이 포함된 데이터프레임이 있다고 가정해봅시다.여기서 'date'열의 데이터 타입을 날짜/시간형으로 변경하려면 다음과 같이 to_datetime() 메서드를 사용할 수 있습니다.
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')
위 코드에서 pd.to_datetime(df['date'], format='%Y-%m-%d')는 'date'열의 모든 값을 날짜/시간형으로 변환한 후 시리즈 객체를 반환합니다. 이 값을 다시 'date'열에 대입하여 'date'열의 데이터 타입을 날짜/시간형으로 변경합니다. 여기서 format 매개변수는 'date'열의 값이 어떤 형식으로 표현되어 있는지를 지정합니다. 위 예시에서는 '%Y-%m-%d' 형식으로 지정했으므로 'date'열의 값들이 'YYYY-MM-DD' 형식으로 표현되어 있다고 가정했습니다.
4.apply()
data = {'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'age': [23, 35, 27, 29, 31],
'score1': [80, 90, 75, 85, 95],
'score2': [85, 95, 70, 80, 90]}
df = pd.DataFrame(data)
다음과 같은 데이터프레임이 있다고 가정해봅시다.여기서 'score1'과 'score2' 열의 값의 평균을 구해서 새로운 열 'score_mean'에 저장하려면 다음과 같이 apply() 메서드를 사용할 수 있습니다.
df['score_mean'] = df[['score1', 'score2']].apply(lambda x: x.mean(), axis=1)
위 코드에서 df[['score1', 'score2']]는 'score1'과 'score2' 열에 해당하는 데이터프레임을 반환합니다. 이 데이터프레임에 apply() 메서드를 적용하면 각 행(row)에 대해 함수를 적용하게 됩니다. 여기서는 lambda x: x.mean() 함수를 적용해서 각 행의 'score1'과 'score2' 열의 평균을 구하도록 했습니다. axis=1 매개변수를 지정하여 각 행(row)에 대해 함수를 적용하도록 했습니다. 마지막으로 이 값을 'score_mean' 열에 대입하여 'score_mean' 열을 추가합니다.
간단하게 샘플 코드로 정리하고자 합니다.
import os
import pandas as pd
import numpy as np
if __name__ == '__main__':
print(f'{os.path.dirname(__file__)}')
#
df = pd.DataFrame( np.random.randn(5, 5),
columns=['A','B','C','D','E' ] )
# show all data
print(df)
# print #2 row
print(df.loc[2, :])
# Dataframe to List
rowList = df.loc[2, :].values.flatten().tolist()
print(rowList)
# subset dataframe to list
rowList = df.loc[2, ['A','E']].values.flatten().tolist()
print(rowList)
[실행결과]
# show all data
print(df)
A B C D E
0 1.736102 -1.477961 -1.179571 1.411220 -0.211700
1 0.175911 -0.518549 0.594174 0.333632 -1.579409
2 0.595619 -0.224543 -0.715213 -0.049334 -0.471737
3 0.639203 -0.451774 -0.009238 0.684090 -0.036995
4 -0.303029 -0.655539 -1.132769 0.485218 1.205955
# print #2 row
print(df.loc[2, :])
A 0.595619
B -0.224543
C -0.715213
D -0.049334
E -0.471737
Name: 2, dtype: float64
# Dataframe to List
rowList = df.loc[2, :].values.flatten().tolist()
print(rowList)
[0.5956188992136562, -0.2245426559477047, -0.7152127642656871, -0.049333965859220306, -0.4717365476151358]
# subset dataframe to list
rowList = df.loc[2, ['A','E']].values.flatten().tolist()
print(rowList)
[0.5956188992136562, -0.4717365476151358]
# 특정 컬럼을 기준으로 DF를 비교하여, 다른 ROW를 추출
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie', 'Dave', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'San Francisco', 'Los Angeles', 'New York', 'San Francisco']
})
# City 컬럼을 기준으로 중복되는 데이터를 제거합니다.
unique_cities = df['City'].unique()
# 다른 row를 저장할 빈 DataFrame을 생성합니다.
result = pd.DataFrame()
# unique_cities를 순회하면서 다른 row를 추출합니다.
for city in unique_cities:
temp_df = df[df['City'] == city]
if len(temp_df) > 1:
# City 컬럼이 같은 row를 비교합니다.
# 중복을 제외한 첫 번째 row와 다른 row를 찾아냅니다.
diff = temp_df.loc[temp_df.index.difference([temp_df.index[0]])]
result = pd.concat([result, diff])
# 결과를 출력합니다.
print(result)