TungNT (Blue)

tungnt.blue@gmail.com

User Tools

Site Tools


development:python:pandas

1. Pandas

https://pandas.pydata.org/docs

Import thư viện:

import pandas as pd
import numpy as np
 
pd.options.mode.copy_on_write = True # https://pandas.pydata.org/docs/user_guide/copy_on_write.html

2. Create DataFrame

2.1 Create from a CSV

df = pd.read_csv('data/pandas/file.csv')
df = pd.read_csv('data/pandas/file.csv', engine="pyarrow")
df = pd.read_csv('data/pandas/file.csv', low_memory=False)

2.2 Create from a Dictionary

tempdict = {'col1':[1,2,3], 'col2':[4,5,6], 'col3':[7,8,9]}
 
df = pd.DataFrame.from_dict(tempdict)

2.3 Create from a DataFrame

df_new = df[["eid", "type", "request_amount", "user_name", "status", "partner_status", "approved_time", "created_at", "updated_at", "date"]]

2.4 Append from DataFrames

df_ut_01 = pd.read_csv('../data/ns/ut_2021_01.csv', engine="pyarrow")
df_ut_02 = pd.read_csv('../data/ns/ut_2021_12.csv', engine="pyarrow")
 
df_ut = df_ut_01._append(df_ut_02)

3. Read DataFrame

3.1 Show Top n and Bottom n Rows

df.head(10)
 
df.head()
 
df.tail(15)

3.2 Show Columns and Data Type

df.columns
 
df.dtypes

3.3 Summary Statistics

df.describe()
 
df.describe(include='object')

3.4 Filtering Columns

df.COLUMN_NAME
 
df['COLUMN_NAME']
 
df[['COLUMN_NAME_1', 'COLUMN_NAME_2']]

3.5 Filtering on Rows

df[df['COLUMN_NAME'] == 'Column Value']
 
df[(df['COLUMN_NAME_1']=='Column Value') & (df['COLUMN_NAME_2']==True)]

Ví dụ 1:

approve_from_time = np.datetime64('2021-01-01 00:00:00')
approve_to_time = np.datetime64('2021-01-30 23:59:59')
 
df_ut_data = df_ut[(df_ut['approved_time'] >= approve_from_time) & (df_ut['approved_time'] <= approve_to_time)]
 
df_ut_data_success = df_ut[(df_ut['partner_status'] == 'SUCCESS') & (df_ut['approved_time'] >= approve_from_time) & (df_payout['approved_time'] <= approve_to_time)]

Ví dụ 2:

remit_accounts = ['TerraPay', 'tranglo', 'Nium', 'GME', 'OnePIP', 'Ipay', 'SingX', 'brdgx', 'hanshan', 'HanshanAPI', 'tranglo_CITAD', 'Nium_CITAD', 'SingX_CITAD']
 
df_payout_remit = df_ut_2024_new[
        (df_ut_2024_new['type'] == 'TRANSFER_BANK') 
        & (df_ut_2024_new["user_name"].isin(remit_accounts))
]

4. Update DataFrame

4.1 Creating Column

df['NEW_COLUMN'] = df['NEW_COLUMN_1'] + df['NEW_COLUMN_2']
df_ut['date'] = pd.to_datetime(df_ut['date'], format='%d/%m/%Y')
df_ut['approved_time'] = pd.to_datetime(df_ut['approved_time'], format='%d/%m/%Y %H:%M:%S')
df_ut['created_at'] = pd.to_datetime(df_ut['created_at'], format='%d/%m/%Y %H:%M:%S')
df_ut['updated_at'] = pd.to_datetime(df_ut['updated_at'], format='%d/%m/%Y %H:%M:%S')
df_ut['processed_time'] = (df_ut['approved_time'] - df_ut['created_at']).dt.seconds
df_ut['weekday'] = df_ut['created_at'].dt.day_name()
df_ut['fee_postpaid'] = np.where(((df_ut['fee_type'] == 'POSTPAID' )) , df_ut['fee'], 0)

4.2. Update a DataFrame

df['COLUMN_NAME'] = 'Column Value'

Ví dụ 1:

def get_fee(entity):
    year = int(entity['created_at'].year)
 
    if year == 2024:
        return get_fee_2024(entity)
 
    return 0
 
def get_fee_2024(entity):
    month = int(entity['created_at'].month)
    day = entity['created_at'].day
    provider = entity['provider']
    request_amount = entity['request_amount']    
    bank_no = entity['bank_no']     
 
    if provider == 'EPAY':
        return 2200
 
    if provider == 'TECHCOMBANK' and bank_no != provider:
        return 275 if month >= 3 else 550  
 
    if provider == 'MBBANK':
        return 880 if bank_no != provider else 1980
 
    if provider == 'VIETINBANK' and bank_no != provider:
        return 1650
 
    if provider == 'VPBANK' and bank_no != provider:
        return 275 if month <= 2 else 605
 
    if provider == 'BIDV':
        if bank_no != provider:
            return 1100
 
        return 1705 if request_amount <= 300000000 else 1925  
 
    return 0
 
df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y')
df['created_at'] = pd.to_datetime(df['created_at'], format='%d/%m/%Y %H:%M:%S')
df['fee'] = df.apply(lambda x: get_fee(x), axis=1)
df['processed_time'] = (df['approved_time'] - df['created_at']).dt.seconds
df.loc[:,'day'] = df.created_at.dt.strftime('%d')

Ví dụ 2:

df_industries = pd.read_csv('../data/ns/user_industries.csv', low_memory=False)
 
df_industries.rename(columns={
    'Tài khoản': 'name', 
    'Tên tài khoản': 'fullname', 
    'Trạng thái': 'status',
    'Thời gian tạo': 'created_at',
    'Ngành nghề': 'industry_name'    
}, inplace=True)
 
df_industries = df_industries.drop(columns=['STT'])
 
df_industries.insert(3, "Note", "")
 
df_industries.set_index('name')
 
df_industries

Ví dụ 3:

import math
 
def get_fee_total(d):
    fee_total = 0
 
    if math.isnan(d['2021_payin_fee_total']) == False:
        fee_total = fee_total + float(d['2021_payin_fee_total'])
    if math.isnan(d['2022_payin_fee_total']) == False:
        fee_total = fee_total + float(d['2022_payin_fee_total'])
    if math.isnan(d['2023_payin_fee_total']) == False:
        fee_total = fee_total + float(d['2023_payin_fee_total'])
    if math.isnan(d['2024_payin_fee_total']) == False:
        fee_total = fee_total + float(d['2024_payin_fee_total'])
 
    if math.isnan(d['2021_payout_fee_total']) == False:
        fee_total = fee_total + float(d['2021_payout_fee_total'])
    if math.isnan(d['2022_payout_fee_total']) == False:
        fee_total = fee_total + float(d['2022_payout_fee_total'])
    if math.isnan(d['2023_payout_fee_total']) == False:
        fee_total = fee_total + float(d['2023_payout_fee_total'])
    if math.isnan(d['2024_payout_fee_total']) == False:
        fee_total = fee_total + float(d['2024_payout_fee_total'])
 
    return fee_total
 
df_fee['fee_total'] = df_fee.apply(lambda x: get_fee_total(x), axis=1)

4.3. Delete a DataFrame

del df

4.4. Convert nan to 0

df_statistic['count'] = df_statistic['count'].fillna(0)

4.5. Convert column type

df_statistic['count'] = df_statistic['count'].astype('Int64')

5. Group/Sort Data

df.groupby(['user_name'])['request_amount'].sum()
 
df_groups = df.groupby(['transaction_id']).agg({'transaction_id':'size', 'fee': 'sum', 'amount': 'mean'}).rename(columns={'transaction_id':'count', 'fee': 'fee_total', 'amount': 'amount_avg'}).reset_index()
 
df_ut_groups = df_ut_trans.groupby(['user_id', 'type']).agg({'type':'size', 'request_amount': 'sum', 'fee': 'sum', 'fee_fixed': 'mean', 'fee_flexible': 'mean', 'partner_fee': 'sum'}).rename(columns={'type':'count', 'request_amount': 'gmv', 'fee': 'fee', 'fee_fixed': 'fee_fixed', 'fee_flexible': 'fee_flexible', 'partner_fee': 'partner_fee'}).reset_index()
 
 
df_groups.sort_values(by='count', ascending=False)
df_groups.sort_values(by='avg', ascending=False)
 
# Tính giá trị trung bình 1 cột
df["internal_time"].mean()
 
# Loại bỏ giá trị trùng lặp và lấy giá trị đầu
df_group = df.groupby('uid').first().reset_index()

6. Merge 2 Dataframe

df_statistic = pd.merge(df_users, df_industries, left_on='name', right_on='name', how = 'left')

7. Output

df.to_csv('data/pandas/output.csv')
 
df.to_json()
 
df.to_html()
 
with pd.ExcelWriter('../data/ns/dd/file.xlsx') as writer:
    df_1.to_excel(writer, sheet_name='sheet 1')
    df_2_excel(writer, sheet_name='sheet 2') 

8 . Others

df_users_with_master.set_index('id', inplace=True)

Cập nhật dữ liệu cột của một dataframe từ một dataframe khác

Giả sử:

  • df1: DataFrame gốc cần cập nhật dữ liệu
  • df2: DataFrame chứa dữ liệu mới để cập nhật
  • key: cột khóa chung giữa df1 và df2
  • column_to_update: cột mà bạn muốn cập nhật trong df1

Cách 1:

Phương thức update() cho phép cập nhật trực tiếp các giá trị trong df1 từ df2 dựa trên các chỉ số hoặc cột chung.

import pandas as pd
 
# Tạo DataFrame ví dụ
df1 = pd.DataFrame({
    'key': [1, 2, 3, 4],
    'column_to_update': ['A', 'B', 'C', 'D']
})
 
df2 = pd.DataFrame({
    'key': [2, 3],
    'column_to_update': ['X', 'Y']
})
 
# Thiết lập 'key' làm chỉ số chung để cập nhật
df1.set_index('key', inplace=True)
df2.set_index('key', inplace=True)
 
# Cập nhật df1 từ df2
df1.update(df2)
 
# Reset index nếu cần thiết
df1.reset_index(inplace=True)
print(df1)

Cách 2:

Nếu chỉ muốn cập nhật một cột cụ thể, có thể dùng map() để ánh xạ giá trị từ df2 sang df1.

# Tạo DataFrame gốc và DataFrame chứa dữ liệu cập nhật
df1 = pd.DataFrame({
    'key': [1, 2, 3, 4],
    'column_to_update': ['A', 'B', 'C', 'D']
})
 
df2 = pd.DataFrame({
    'key': [2, 3],
    'column_to_update': ['X', 'Y']
})
 
# Ánh xạ giá trị từ df2 sang df1 dựa trên 'key'
df1['column_to_update'] = df1['key'].map(df2.set_index('key')['column_to_update']).fillna(df1['column_to_update'])
print(df1)

Cách 3:

Dùng merge() để kết hợp hai DataFrame dựa trên key, sau đó chọn cột cập nhật từ df2.

# Kết hợp df1 và df2
df_combined = df1.merge(df2[['key', 'column_to_update']], on='key', how='left', suffixes=('', '_new'))
 
# Cập nhật cột từ df2 nếu có
df_combined['column_to_update'] = df_combined['column_to_update_new'].combine_first(df_combined['column_to_update'])
 
# Bỏ cột phụ
df_combined.drop(columns='column_to_update_new', inplace=True)
print(df_combined)

Xóa nhiều bản ghi cùng lúc

# Xóa các dòng có index là 1 và 3
df = df.drop(index=[1, 3], inplace=True)

# Xóa các dòng có id là 1 và 3
df = df[~df['id'].isin([1, 3])]
development/python/pandas.txt · Last modified: 2024/11/19 14:41 by tungnt

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki