目录
数据类型
查看类型
类型转换
无法转换的值返回NaN
无法转换的值返回原值
datetime类型
datetime类型数据列作为df索引
Python中的timedelta类型
Pandas中的timedelta类型
pd.to_timedelta函数转换timedelta类型
timedelta类型数据作为df索引
分组groupby
分箱
合并
append关键字
concat关键字
merge关键字
join关键字
总结
数据类型
加载数据
import pandas as pd# 加载数据
df = pd.read_csv("/root/pandas_code_ling/data/c_city_day.csv")
df查看类型
类型转换
df['PM2.5'] = df['PM2.5'].astype(str) df.info()加载数据
df = pd.read_csv("/root/pandas_code_ling/data/c_city_day.csv") df2 = df.head().copy() df2['NO']df2.loc[::2,'NO'] = 'missing' df2类型必须一致 否则不能类型转换 df2['NO'].astype(float)无法转换的值返回NaN
pd.to_numeric(df2['NO'], errors='coerce') # 强制无法转换的值返回原值
pd.to_numeric(df2['NO'], errors='ignore') # 忽略datetime类型
from datetime import datetime now = datetime.now() print(now) dt2 = datetime(2024,10,5,10) print(dt2) print(type(dt2))加载数据
df = pd.read_csv("/root/pandas_code_ling/data/c_city_day.csv") df.info()转换为时间类型 法一 df = pd.read_csv("/root/pandas_code_ling/data/c_city_day.csv", parse_dates=['Date'])法二 df = pd.read_csv("/root/pandas_code_ling/data/c_city_day.csv") df['Date'] = pd.to_datetime(df['Date']) df.info()法三 df = pd.read_csv("/root/pandas_code_ling/data/c_city_day.csv") df['Date'] = df['Date'].astype(dtype='datetime64[ns]') df.info()输出Series对象的年、月、日
print(type(df['Date'])) print(df['Date'].head().dt.year) print(df['Date'].head().dt.month) print(df['Date'].head().dt.day)d = pd.to_datetime('2020-06-20') print(d.year) print(d.month) print(d.day) print(type(d))日期计算天数
df['Date'].max() - df['Date'].min()df['Date'] - df['Date'].min()计算相差几个月
def fn(dt): return (dt - df['Date'].min()).days / 30 df['month_diff'] = df['Date'].apply(fn) dfdatetime类型数据列作为df索引
df = pd.read_csv('/root/pandas_code_ling/data/c_city_day.csv', parse_dates=['Date'], index_col=[1]) df.info() df.sort_index(inplace=True)df['2016']df['2016-12']日期范围
df['2016-12-1 22':'2016-12-15 23:00:08']Python中的timedelta类型
from datetime import datetime t1 = datetime.now() t2 = datetime(2024, 9, 30) diff = t1 - t2 # 时间差类型 print(diff) print(type(diff))Pandas中的timedelta类型
df = pd.read_csv('/root/pandas_code_ling/data/c_city_day.csv', parse_dates=['Date']) df['dt_diff'] = df['Date'] - df['Date'].min() df[['Date', 'dt_diff']]pd.to_timedelta函数转换timedelta类型
print(df['dt_diff'].dtype) -- timedelta64[ns]df['dt_diff'] = df['dt_diff'].astype(str) print(df['dt_diff'].dtype) print(df['dt_diff'])df['dt_diff'] = pd.to_timedelta(df['dt_diff']) df -- 类型 timedelta64[ns]timedelta类型数据作为df索引
df = pd.read_csv('/root/pandas_code_ling/data/c_city_day.csv', parse_dates=['Date']) df.info()df2 = df.query('City=="Delhi"') df2df2.index = df2['Date'] - df2['Date'].min() df2df2['0 days':'4 days']
分组groupby
import pandas as pd df.groupby分组函数返回分组对象 df = pd.read_csv('/root/pandas_code_ling/data/b_LJdata.csv') df2 = df.head(20).copy() df2gs = df2.groupby(by="区域") # DataFrameGroupBy print(gs) # <pandas.core.groupby.generic.DataFrameGroupBy object at 0x7fbfc7c240d0>gs['价格'] # <pandas.core.groupby.generic.SeriesGroupBy object at 0x7fbfc71b1fd0>df2.groupby(by=["区域", "户型"])['价格'].mean()# 不加mean是引用地址
# <pandas.core.groupby.generic.SeriesGroupBy object at 0x7fbfc71b1c40>gs2 = df2.groupby(by="户型") gs2.first() 取第一个gs2.last() 取最后一个获取分组后每组的名称 gs2.grouper.result_index获取3室1厅的租房信息 gs2.get_group(name='3室1厅')求 根据 户型 分组, 求 面积和价格 的平均值 result = df2.groupby(by='户型')[["面积", "价格"]].mean() result求 根据 户型 分组, 求 面积和价格 的平均值和求和 result = df2.groupby(by='户型')[["面积", "价格"]].agg(['mean', 'sum']) result按户型分组, 计算 每组价格的平均值+求和 和 看房人数的总数 result = df2.groupby(by='户型').agg({"价格":["mean", "sum"], "看房人数":"sum"}) result# 按户型分组, 计算每组价格和看房人数的平均值法一
result = df2.groupby(by = '户型')[['价格','看房人数']].mean() result法二
def fn(x): s_mean = x.sum() / x.size return s_mean result = df2.groupby(['户型'])[["价格", "看房人数"]].agg(fn) result
分箱
df3 = df.head(20).copy() # 复制数据集 # 分箱返回Seriers对象并复制给新的列 df3['价格高中低'] = pd.cut(x=df2['价格'], bins=3, labels=['低', '中', '高']) df3df4 = df.head(20).copy() # 复制数据集 # 分箱返回Seriers对象并复制给新的列 # df4['价格高中低'] = pd.cut(x=df2['价格'], bins=3, labels=['低', '中', '高']) df4['价格高中低'] = pd.cut(x=df4['价格'], bins=[0,3000,8000,210000]) df4python
import pandas as pd import numpy as np # 创建示例数据 data = np.random.randn(20) data # 进行分箱 bins = [-3, -1, 1, 3] categories = pd.cut(data, bins) print(categories) print('------------------------------------') # 可以指定标签 labels = ['low', 'medium', 'high'] categories_with_labels = pd.cut(data, bins, labels=labels) print(categories_with_labels)
df2 = df.head(20).copy() # 复制数据集 # 分箱返回Seriers对象并复制给新的列 df2['区间'] = pd.cut(x=df2['价格'], bins=3, labels=['低', '中', '高']) df2[['价格', '区间']].sort_values(['价格'])df2[['价格', '区间']].sort_values(['价格']) df2 = df.head(20).copy() # 复制数据集 # 分箱返回Seriers对象并复制给新的列 df2['区间'] = pd.cut(x=df2['价格'], bins=[0, 4000, 10000, 200000]) df2[['价格', '区间']].sort_values(['价格'])df2 = df.head(20).copy() # 复制数据集 # 分箱返回Seriers对象并复制给新的列 df2['区间'] = pd.cut(x=df2['价格'], bins=[0, 4000, 10000, 200000], labels=['低', '中', '高']) df2[['价格', '区间']].sort_values(['价格'])
合并
类似于mysql的多表联查
import pandas as pd df1 = pd.DataFrame([[1, 2, 3], [1, 10, 20], [5, 6, 7], [3, 9, 0], [8, 0, 3]], columns=['x1', 'x2', 'x3']) df1df2 = pd.DataFrame([[1, 2], [1, 10], [1, 3], [4, 6], [3, 9]], columns=['x1', 'x4']) df2append关键字
df1.append(df2) --> union all #df1.append(df2, ignore_index=True) # 下面的索引从0-9concat关键字
纵向连接,全部数据都保留 pd.concat([df1, df2])纵向连接,只保留共有数据 pd.concat([df1, df2], join='inner')横向连接,全部数据都保留 pd.concat([df1, df2], axis=1)横向连接,保留索引值匹配的数据 pd.concat([df1, df2], join='inner', axis=1)merge关键字
pd.merge(df1, df2, how='left', on='x1')pd.merge(df1, df2, how='right', on='x1')pd.merge(df1, df2, how='inner', on='x1')pd.merge(df1, df2, how='outer', on='x1')join关键字
df1.join(df2, lsuffix='_df1的列名后缀', rsuffix='_df2的列名后缀', how='outer')
总结
①类型
Pandas数据类型
Python类型
说明
object
str
字符串
int64
int
整数
float64
float
浮点数
bool
bool
布尔值
category
无原生类型
分类类型
datetime
无原生类型
时间日期类型
timedelta
无原生类型
时间差类型
②数据结构中的数据类型
object --> python str 字符串 【数据类型】
int64 --> python int 整数 【数据类型】
float64 --> python float 小数 【数据类型】
bool --> python bool True False 【数据类型】
datetime64 --> python datetime 时间日期 【数据类型】
timedelta[ns]--> 两个时间点之间相距的时间差,单位是纳秒 【数据类型】
③Pandas数据类型转换基本方法
df['列名'].astype(str)
当Seriers对象使用astype函数转换的结果中数据类型不同时,使用to_numeric函数
pd.to_numeric(df['列名'], errors='coerce')
无法转换的值返回NaN
pd.to_numeric(df['列名'], errors='ignore')
无法转换的值返回原值④datetime时间类型
datetime时间类型的Seriers来源两种方式:
读取时指定
df = pd.read_csv('..xxx.csv', parse_dates=[1])
转换
df['Date'] = pd.to_datetime(df['Date'])
提取datetime时间类型的Seriers中的具体年月日时分秒星期
df['Date'].dt.year
df['Date'].dt.quarter
# 季度
df['Date'].dt.dayofweek + 1
# 星期提取datetime时间类型的Seriers中的某一个值的具体年月日时分秒星期
df4['Date'][0].dayofweek+1 # 星期
datetime时间类型的Seriers可以进行时间计算
直接调用聚合函数
df['Date'].max() # 最近的日期
计算时间差
df['Date'] - df['Date'].min() # 返回时间差类型数据构成的Seriers
datetime时间类型的S对象作为索引的两种方式
df = pd.read_csv('..xxx.csv', index_col='Date', parse_dates=True)
df.index = df['date']
注意:要对索引进行重新排序 必要步骤
df = df.sort_index()
datetime时间类型索引可以按照时间范围取子集
df['2018']
df['2016-06']
df.loc['2015-3-4 22': '2016-1-1 23:45:00']
⑤timedelta时间差类型
timedelta时间差类型的创建:
df['date_diff'] = df['Date'] - df['Date'].min()
字符串类型转换为时间差类型
s2 = pd.to_timedelta(s1)
timedelta时间差类型设为索引
df.index = df['Date'] - df['Date'].min()
基于时间差范围来选择数据
df['0 days':'4 days']
⑥分组对象
gs = df.groupby(['列1', '列2'])
按照列1、列2的值对数据集进行分组,返回分组对象
gs.first()
返回每组的第一条数据
gs.last()
返回每组的最后一条数据
gs.grouper.result_index
获取全部组名
gs.get_group((组名))
按照分组后对多列分别使用不同的聚合函数
df.groupby(['列名1', '列名2']).agg({ '指定列1':'mean', '指定列2':'sum', '指定列3':'mean' })
⑦数据离散化(分箱)用来把一组数据分割成若干个离散的区间。比如有一组年龄数据,可以使用
pandas.cut
将年龄数据分割成不同的年龄段并打上标签。上述过程又叫做分箱。
- 参数x 指定离散化(分箱)依据的列,Seriers对象
- 参数bins 分为几组,int类型,也可以传入分组区间的列表
- 参数labels 每组的标签名称,按数值由小到大的顺序
- 参数right 默认True:左开右闭;False:左闭右开
- 参数include_lowest 默认False:不包含第一个分组的起始值;True:包含
⑧合并df的四个函数总结
df1.append(df2)
纵向合并数据集
pd.concat([df1,df2])
横向或纵向合并数据集,df1和df2可以没有任何关系
df1.merge(df2)
横向合并, df1和df2要有关联的列, 类似SQL中的表关联操作
df1.join(df2)
横向合并,df1和df2要有相同的索引值才能关联