pandas 常用操作記錄
apply函數
一個非常靈活的函數,能夠對整個DataFrame或者Series執行給定函數的操作。
函數可以是自定義的,也可以是python或者pandas內置的函數,還可以是匿名函數。
作用: 用于數值轉換, 或者添加新列的時候
模擬數據:
import pandas as pd
import numpy as np
df = pd.DataFrame(
{"name":["xiaoming","sunjun","jimmy","tom"],
"sex":["male","female","female","male"],
"chinese":[100,80,90,92],
"math":[90,100,88,90]
})
df
例子:
1/ 轉換某列的數值
df["chinese"] = df["chinese"].apply(float)
或者:
df['chinese'] = df['chinese'].astype(float)
2/ 性別列轉換,將性別為male的改為0, female改為1
def change_sex(x): # male-0 female-1
return 0 if x == "male" else 1
df["sex"] = df["sex"].apply(change_sex)
或者用lambda函數
df['sex'] = df.apply(lambda x: 0 if x.sex == 'male' else 1, axis=1) # axis的意思代表從橫向處理
3/ 用lambda函數將name首字母大寫:
df["name"] = df["name"].apply(lambda x: x.title())
4/ 新增一列 求chinese和math的總分
df['score'] = df.apply(lambda x: x.chinese + x.math, axis=1) # 同時操作兩列,記得axis=1
5/ 將某列的日期改變
import datetime
def change_day(x):
year = x.year - 100 if x.year > 1989 else x.year
return datetime.date(year, x.month, x.day)
wind['Yr_Mo_Dy'] = wind['Yr_Mo_Dy'].apply(change_day)
wind.head()
---
# 新增年月日列
wind['data'] = wind.Yr_Mo_Dy
wind['month'] = wind['data'].apply(lambda data: data.month)
wind['year'] = wind['data'].apply(lambda data: data.year)
wind['day'] = wind['data'].apply(lambda data: data.day)
agg函數:
agg函數一般和groupby函數一起使用
1/ 求chinese的平均分和sum
df["chinese"].agg(["mean", "sum"])
或者
op_dict = {'chinese': 'sum', 'chinese2':'mean'}
df['chinese2'] = df.chinese
df2 = df['chinese'].agg(op_dict).reset_index()
df2.columns = ['index',"score"]
df2
2/求男生和女生的ch的平均分和總分是多少
df['chinese2'] = df.chinese
op_dict = {'chinese': 'sum', 'chinese2':'mean'}
df2 = df.groupby('sex').agg(op_dict).reset_index() # reset_index用于將columns定為索引
df2
3/統計性別男女 sex 的chinese 的平均分(新增一個字段放在最后面)
op_dict = {'chinese': 'mean'}
df1 = df.groupby('sex').agg(op_dict).reset_index() # 先求出男女平均分,然后merge在一起
df1.columns = ["sex", "chi_average"]
df1
df.merge(df1,on='sex', how='left')
merge函數
作用: 多用于合并
用法:
1/ 將兩個表合并
df_data = df_data.merge(node_events_detail_df, on=['device_id', 'day'], how='left').fillna(0) # df_data和node_events_detail_df合并 , 拼合字段為on ,how為left 左連接和outer外聯,
fillna(0) 為如果是空值則補0
判斷dateframe是否為空
if df_data.empty:
pivot_table函數
作用:透視表,將列轉為行
參考具體用法
https://blog.csdn.net/mingkoukou/article/details/82870960
例子:
node_events_detail_df = node_events_detail_df[['device_id', 'pn', 'day', 'calculate_event_type_num']] # 排好需要用到的columns
# 透視表,需要選擇到的columns=pn,新增一列calculate_event_type_num 其實就是改了名字的pn, 選取values的值 則為pn的值,fill_value 為默認值為0 aggfunc為遇到相同的pn 聚合函數或函數列表, 最后轉為int
node_events_detail_df = node_events_detail_df.pivot_table(index=['biz_game_code', 'biz_gcp_code', 'device_id', 'day'],columns='pn',values='calculate_event_type_num', fill_value='0', aggfunc='sum').astype(int)
node_events_detail_df = node_events_detail_df.reset_index()
新增一列數據
chipo['new'] = chipo.apply(lambda x: x.item_price[1:-1] if x.item_price else 0, axis=1) # 切片去掉不能轉為浮點數的數字
data_df['ip_name'] = data_df.apply(lambda x: self.get_ip_city(x.ip_name), axis=1)
data_df['ifa_type'] = data_df.apply(lambda x: self.get_ifa_type_name(x.ifa_type), axis=1)
data_df['newflag_g'] = data_df.apply(lambda x: '是' if x.newflag_g else '否', axis=1)
data_df['newflag_gcp'] = data_df.apply(lambda x: '是' if x.newflag_gcp else '否', axis=1)
iloc函數
作用:將df進行一個切割
df[:,:] # 前面控制的是多少行, 后面控制的是多少列, 從0開始算
參考具體用法

concat函數
作用: 將兩個二維數組合并
用法:
import numpy as np
import pandas as pd
raw_data_1 = {
'subject_id': ['1', '2', '3', '4', '5'],
'first_name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'last_name': ['Anderson', 'Ackerman', 'Ali', 'Aoni', 'Atiches']}
raw_data_2 = {
'subject_id': ['4', '5', '6', '7', '8'],
'first_name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'last_name': ['Bonder', 'Black', 'Balwner', 'Brice', 'Btisan']}
raw_data_3 = {
'subject_id': ['1', '2', '3', '4', '5', '7', '8', '9', '10', '11'],
'test_id': [51, 15, 15, 61, 16, 14, 15, 1, 61, 16]}
data1 = pd.DataFrame(raw_data_1)
data2 = pd.DataFrame(raw_data_2)
data3 = pd.DataFrame(raw_data_3)
# data1和data2兩個數據框按照行的維度進行合并,命名為all_data
all_data = pd.concat([data1, data2])
all_data
# data1和data2兩個數據框按照列的維度進行合并,命名為all_data_col
all_data_col = pd.concat([data1, data2], axis=1)
all_data_col
# 按照subject_id的值對all_data和data3作合并
all_data
all_data.merge(data3, on=['subject_id'],how='left').fillna(0)
# 對data1和data2按照subject_id作連接
data1.merge(data2, on='subject_id', how='inner',suffixes=('_left', '_right'))
query函數的使用
作用: 對二維數組 數據進行查找使用
用法:
# 查找是columns為day的8月2號的數據且廣告id為1的,然后相加
pay_df.query('ad_id==1 and user_day == "20220802"').sum()

浙公網安備 33010602011771號