MINERVA/Python 2023. 4. 28. 04:12
반응형

Pandas에서 데이터프레임의 열(column)의 데이터 타입을 변경하는 방법은 아래와 같습니다.

  1. astype() 메서드 사용
    • astype() 메서드는 데이터프레임 내의 모든 값을 지정한 데이터 타입으로 변환합니다.
    • 예시: df['column_name'] = df['column_name'].astype('int')
  2. to_numeric() 메서드 사용
    • to_numeric() 메서드는 데이터프레임 열의 값을 수치형으로 변환합니다.
    • 예시: df['column_name'] = pd.to_numeric(df['column_name'], errors='coerce')
  3. to_datetime() 메서드 사용
    • to_datetime() 메서드는 데이터프레임 열의 값을 날짜/시간형으로 변환합니다.
    • 예시: df['column_name'] = pd.to_datetime(df['column_name'], format='%Y-%m-%d')
  4. 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' 열을 추가합니다.

반응형
posted by choiwonwoo
:
MINERVA/Python 2023. 4. 4. 15:34
반응형

간단하게 샘플 코드로 정리하고자 합니다.

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]

반응형
posted by choiwonwoo
:
MINERVA/Python 2023. 4. 3. 12:31
반응형

 

# 특정 컬럼을 기준으로 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)
반응형
posted by choiwonwoo
: