Pandas -----------------------基础知识(六)

目录

数据类型

查看类型

类型转换

无法转换的值返回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)
df

datetime类型数据列作为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"')
df2
复制代码
df2.index = df2['Date'] - df2['Date'].min()
df2
复制代码
df2['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()
df2
复制代码
gs = 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=['低', '中', '高'])
df3
复制代码
df4 = df.head(20).copy() # 复制数据集 
# 分箱返回Seriers对象并复制给新的列
# df4['价格高中低'] = pd.cut(x=df2['价格'], bins=3, labels=['低', '中', '高'])
df4['价格高中低'] = pd.cut(x=df4['价格'], bins=[0,3000,8000,210000])
df4

python

python 复制代码
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'])
df1
复制代码
df2 = pd.DataFrame([[1, 2], [1, 10], [1, 3], [4, 6], [3, 9]], columns=['x1', 'x4'])
df2

append关键字

复制代码
df1.append(df2)   -->  union all
#df1.append(df2, ignore_index=True) 
# 下面的索引从0-9

concat关键字

复制代码
纵向连接,全部数据都保留
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((组名)) 按照

  • 分组后对多列分别使用不同的聚合函数

python 复制代码
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要有相同的索引值才能关联

相关推荐
壹屋安源1 天前
自动生成发票数据并存入Excel
python·excel·pandas·random·datetime·faker
Dream25121 天前
【数据分析之pandas】
数据挖掘·数据分析·pandas
Mobius80863 天前
探索 Seaborn Palette 的奥秘:为数据可视化增色添彩
图像处理·python·信息可视化·数据分析·pandas·matplotlib·数据可视化
赛丽曼4 天前
Pandas
人工智能·python·pandas
道友老李5 天前
【机器学习】数据分析之Pandas(一)
人工智能·python·机器学习·数据分析·pandas
无形忍者5 天前
Pandas系列|第一期:列值的前N码模糊匹配
linux·运维·pandas
code04号6 天前
df = pd.DataFrame(data)中的data可以是什么类型的数据?
python·pandas
runepic7 天前
[python]使用 Pandas 处理 Excel 数据:分割与展开列操作
python·excel·pandas
潜洋7 天前
Pandas教程之二十九: 使用 Pandas 处理日期和时间
python·pandas
fmc1211048 天前
【5】数据分析基础(series2)
数据挖掘·数据分析·pandas