pandas学习
1.pandas简介与功能
Pandas 是一个功能强大的 Python 数据分析和处理工具,广泛应用于数据科学、数据分析和机器学习领域。它提供了高效的数据操作方式,用于加载、清洗、操作和分析结构化数据。
具体功能与步骤:
1.数据加载与存储
多种数据格式读取与保存
例如: csv,excel,sql
2.数据清洗与预处理
3.数据清洗与预处理
4.数据操作与转换
5.数据统计与分析
6.数据可视化
2.数据结构和数据类型
1.Series相关操作
2.1.创建
# 这里都是一维的才可以
s1 = pd.Series(列表/字典/ndarray,index = 索引名(要和元素个数相同))
☆Series相关问题与例子解决
例子1
s9 = np.arange(6)
s10 = pd.Series(s9)
s10,type(s9),type(s10)
- 这里dtype的元素类型,对于都是这种基础元素会直接显示,dtype具体的类型也与环境有关系
(0 0
1 1
2 2
3 3
4 4
5 5
dtype: int32,
numpy.ndarray,
pandas.core.series.Series)
例子2
# 创建array(10行5列)并设置同学分数
arr1 = np.random.randint(40,101,size=(10,5))
# 创建DataFrame对象
score_df2 = pd.DataFrame(arr1)
# 设置列名
columns = ['语文','英语','数学','物理','化学']
# 设置索引行
indexs = ['同学'+ str(i) for i in range(score_df.shape[0])]
# 设置列名和索引
score_df2.columns = columns
score_df2.index = indexs
score_df2.head()
# 在pandas中object表示字符串,等价于python中的str ☆
# values其实相当于一个ndarray,所以df转ndarray(df.values)这样就可以转换了
# ndarray转df则可以直接pd.DataFrame(ndarray)
print(type(score_df2.columns[1]))
print(type(score_df2.columns))
score_df2.columns,score_df2.index,score_df2.values
- 这里因为pandas中的object指的是字符串指的是数据(‘语文’, ‘英语’, ‘数学’, ‘物理’, ‘化学’)
<class 'str'>
<class 'pandas.core.indexes.base.Index'>
(Index(['语文', '英语', '数学', '物理', '化学'], dtype='object'),
Index(['同学0', '同学1', '同学2', '同学3', '同学4', '同学5', '同学6', '同学7', '同学8', '同学9'], dtype='object'),
array([[83, 44, 65, 71, 71],
[72, 77, 51, 62, 47],
[71, 97, 96, 79, 92],
[46, 80, 88, 96, 61],
[56, 80, 98, 45, 71],
[87, 53, 91, 41, 57],
[66, 56, 97, 98, 53],
[74, 74, 47, 87, 41],
[99, 40, 70, 43, 82],
[70, 46, 71, 82, 80]]))
例子3
# df.dtypes返回的是一个Series☆
print(type(score_df2.dtypes[1]))
print(score_df2.dtypes[1])
score_df2.dtypes[0] = 1
print(score_df2.dtypes[0])
print(type(score_df2.dtypes))
score_df2.dtypes
- 第一个输出因为score_df2.dtypes其实是一个Series里边的数据就是
语文 int32
英语 int32
数学 int32
物理 int32
化学 int32
因此索引1指的是英语对应的int32,也就是int32,类型对应的是<class 'numpy.dtype[int32]'>
- 第二个是因为pandas的dtype的属性是只读的,无法直接修改
# 假设 score_df2 是一个 DataFrame,可以这样修改
score_df2['列名'] = score_df2['列名'].astype('新的类型')
- 第三个一开始一直不理解为什么都是int32,为什么dtype是object而不是<class ‘numpy.dtype[int32]’>
因为是多个值本质是
numpy.dtype[int32]
,复杂的 Python 对象都被归类为object基础数值则是直接会返回如(浮点数则都会是float)
<class 'numpy.dtype[int32]'>
int32
int32
<class 'pandas.core.series.Series'>
语文 int32
英语 int32
数学 int32
物理 int32
化学 int32
dtype: object
2.Series属性
1.创建一个例子
s5 = pd.Series([i for i in range(1,6)] , index=[i for i in 'ABCDA'])
s5
A 1
B 2
C 3
D 4
A 5
dtype: int64
2.index属性
s5.index,type(s5.index)
是索引行
(Index(['A', 'B', 'C', 'D', 'A'], dtype='object'),pandas.core.indexes.base.Index)
3.values属性
s5.values,type(s5.values)
Series的值,发现是ndarray
(array([1, 2, 3, 4, 5], dtype=int64), numpy.ndarray)
4.索引
s5['A'],s5.loc['A']
都是A索引指向的
3.DataFrame相关操作
3.1.Dataframe对象创建
# 方式1,通过字典创建
data_dict = {
'日期' :['12-19','12-20','12-21'],
'温度' : [0,0,-1],
'湿度' : [50,50,50]
}
df1 = pd.DataFrame(data_dict,index=[1,2,3])
df1
# 方式2,通过列表加元组(或列表)转
mylist = [
['12-19',0,60],
['12-20',2,70],
('12-21',1,88), #这里有元组有列表
]
df2 = pd.DataFrame(mylist,columns=['日期','温度','温度'])
df2
# 方式3,通过numpy的ndarray创建DataFrame对象
np.arange(15).reshape(3,5)
df = pd.DataFrame(np.zeros(15).reshape(3,5))
df
①创建时设置列名和索引
# 创建array(10行5列)并设置同学分数
arr1 = np.random.randint(40,101,size=(10,5))
# 创建DataFrame对象
score_df = pd.DataFrame(arr1)
# 设置列名
columns = ['语文','英语','数学','物理','化学']
# 设置索引行
indexs = ['同学'+ str(i) for i in range(score_df.shape[0])]
score_df = pd.DataFrame(arr1,columns=columns,index=indexs)
②创建后设置列名和索引
# 创建DataFrame对象
score_df2 = pd.DataFrame(arr1)
# 设置列名和索引
score_df2.columns = columns
score_df2.index = indexs
score_df2.head()
4.DataFrame属性
# 三个属性类似Seris
# 这里1是列名,2是索引行,值
score_df2.columns,score_df2.index,score_df2.values
(Index(['语文', '英语', '数学', '物理', '化学'], dtype='object'),
Index(['同学0', '同学1', '同学2', '同学3', '同学4', '同学5', '同学6', '同学7', '同学8', '同学9'], dtype='object'),
array([[83, 44, 65, 71, 71],
[72, 77, 51, 62, 47],
[71, 97, 96, 79, 92],
[46, 80, 88, 96, 61],
[56, 80, 98, 45, 71],
[87, 53, 91, 41, 57],
[66, 56, 97, 98, 53],
[74, 74, 47, 87, 41],
[99, 40, 70, 43, 82],
[70, 46, 71, 82, 80]]))
5.DataFrame的方法
# 前n行数据默认值5
score_df2.head(n)
# 后n行数据,默认5
score_df2.tail(n)
# 看统计信息
score_df2.describe()
# 看详细信息 ☆
score_df2.info()
这是具体信息
<class 'pandas.core.frame.DataFrame'>
Index: 10 entries, 同学0 to 同学9
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 语文 10 non-null int32
1 英语 10 non-null int32
2 数学 10 non-null int32
3 物理 10 non-null int32
4 化学 10 non-null int32
dtypes: int32(5)
memory usage: 580.0+ bytes
pandas常用方法
1.转置
df.T
2.增加列
# 索引不能只改一个,只能改全部,这里这个操作相当于增加一列
# 下面的操作就是创建一个同学2列名下全设置为'stu2'
# score_df2['同学2'] = 'stu2'
# 这里我们在删除掉 axis 0是行,1是列
# score_df2.drop('同学2',axis=1,inplace=True)
score_df2
3.设置索引列
df = pd.DataFrame(
{
'month':[1,4,7,10],
'sale':[55,54,57,50],
'year':[2012,2013,2014,2015],
}
)
# inplace会影响源数据
# df.set_index('month',inplace=True)
# drop默认True,会删除列放到索引的列,移到另一个位置
df.set_index('month',drop=True).reset_index(drop=False)
set_index(drop默认为True)
# 当reset后仍然可以接着重构先是会index,然后level_0,就不可了
df.reset_index(inplace=True)
df
(drop = False)时会将索引转到列名中,索引填入0,1,...
设为True时直接扔掉
执行两次reset_index(drop默认为False)可以不断的将索引放到列名中
3.设置多列索引
# 设置多列索引
df.set_index(['year','month'])
MultiIndex([(2012, 1),
(2013, 4),
(2014, 7),
(2015, 10)],
names=['year', 'month'])
会设置year和month都是索引
4.Pandas的数据类型
df或s对象中具体每一个值的数据类型有很多,如下表所示
Pandas数据类型 | 说明 | 对应的Python类型 |
---|---|---|
Object | 字符串类型 | string |
int | 整数类型 | int |
float | 浮点数类型 | float |
datetime | 日期时间类型 | datetime包中的datetime类型 |
timedelta | 时间差类型 | datetime包中的timedelta类型 |
category | 分类类型 | 无原生类型,可以自定义 |
bool | 布尔类型 | bool(True,False) |
nan | 空值类型 | None |
1.category类型
类型用于分类数据,通常用于有限的集合的类型,如:颜色,种类,优点在于占用更少的内存,并对分类操作更快
# 在创建df或s时,astype和dtype设置
fruits = pd.Series([1,'1','2','3','5','2'],dtype='category')
print(fruits)
0 1
1 1
2 2
3 3
4 5
5 2
dtype: category
Categories (5, object): [1, '1', '2', '3', '5']
2.datetime和timedelta类型
# DatetimeIndex类型(pandas 中专门处理时间序列数据的索引类型)
date1 = pd.to_datetime(['2024-12-21','2024-12-22','2024-12-23'])
# Timestamp是 pandas 对 datetime 对象的封装,本质是datetime类型的对象
date2 = pd.to_datetime('2024-12-21')
print(date1[0])
date1,type(date1),date2,type(date2),date2-date1 # 返回TimedeltaIndex其中每个元素是一个 Timedelta 对象,表示两个日期之间的差异
2024-12-21 00:00:00
(DatetimeIndex(['2024-12-21', '2024-12-22', '2024-12-23'], dtype='datetime64[ns]', freq=None),
pandas.core.indexes.datetimes.DatetimeIndex,
Timestamp('2024-12-21 00:00:00'),
pandas._libs.tslibs.timestamps.Timestamp,
TimedeltaIndex(['0 days', '-1 days', '-2 days'], dtype='timedelta64[ns]', freq=None))