1. 认识Pandas
Pandas 是 Python 语言的一个扩展程序库,用于数据挖掘和数据分析,同时也提供数据清洗功能。
pandas(panel data & data analysis),是基于 numpy(提供高性能的矩阵运算)专门用于数据分析的工具,是一个强大的分析结构化数据(表格数据)的工具集;
Pandas的操作是基于两种结构: DataFrame结构 和 Series结构
2. DataFrame
2.1. 结构
每一列都为Series结构,多个Series组成DataFrame结构
DataFrame 构造方法
pandas.DataFrame( data, index, columns, dtype, copy)
data:数据(array-like 类型:可以是ndarray、series, map, lists, dict 等类型)。
index:行索引,如果不指定行索引—默认给一个0、1、2、3、… 这样的序号行索引。
columns:列索引 ,如果不指定列索引—默认给一个0、1、2、3、… 这样的序号列索引。
dtype:数据类型。
copy:拷贝数据,默认为 False。
2.2. 属性
以该DataFrame为基准
import pandas as pd
# 创建DataFrame结构
df = pd.DataFrame(
data=[
['zs', 19, 1],
['ls', 20, 1],
['ww', 19, 2]
],
index=['stu0', 'stu1', 'stu2'],
columns=['name', 'age', 'group']
)
print('df:\n', df)
print('df:\n', type(df))
#结果:
df:
name age group
stu0 zs 19 1
stu1 ls 20 1
stu2 ww 19 2
df:
<class 'pandas.core.frame.DataFrame'>
- 结构体变量
- ndim维度 — DataFrame结构为二维
- shape — 形状
- size — 数据个数
- dtypes ---- 返回每一列的数据类型 ---- 不同的列数类型可以不同
- index ---- 返回DataFrame行索引
- columns ---- 返回DataFrame列索引
- values ----- 返回数据 , 类型为numpy.ndarray(数组)
print('ndim:', df.ndim)
print('ndim:', df.ndim)
print('shape:', df.shape)
print('size:', df.size)
# print('dtype:', df.dtype) # 'DataFrame' object has no attribute 'dtype' 没有该属性
print('dtypes:\n', df.dtypes)
print('index:', df.index)
print('columns:', df.columns)
print('values:\n', df.values)
print('values:\n', type(df.values))
#结果:
ndim: 2
shape: (3, 3) #shape[0]表示行数量,shape[1]表示列数量,
size: 9 #表示其中数据量
dtypes:
name object
age int64
group int64
dtype: object
index: Index(['stu0', 'stu1', 'stu2'], dtype='object')
columns: Index(['name', 'age', 'group'], dtype='object')
values:
[['zs' 19 1]
['ls' 20 1]
['ww' 19 2]]
values:
<class 'numpy.ndarray'>
2.3. 初始化方式
res = pd.DataFrame()
res = pd.DataFrame(columns=['x0', 'x1', 'x2', 'x3'],dtype=object)#data=None,
res = pd.DataFrame({'name': ['a','b'], 'symbol': ['symb1','symb2']})
# 将score_dict字典转换DataFrame并且转制
res = pd.DataFrame(self.score_dict).T
3. Series
3.1. 结构
一维的数据 ----- 行维度的数据
- Series 构造方法
pandas.Series( data, index, dtype, name, copy)
- Serise的参数与Dataframe的参数相似:
- data:一组数据(array-like 类型)。
- index:数据索引标签,不指定默认从 0 开始。可指定array-like 类型需和data长度相同。
- dtype:数据类型,默认会自己判断。
- name:设置名称(str 类型),相当于Dataframe结构指定多列名称的Columns 变为单列的name。
- copy:拷贝数据,默认为 False。
同DataFrame结构关系: DataFrame的每一具体行,就是一个Series的具体结构单元实例;每一行index即为原有DataFrame结构中的Column,name为原有DataFrame中行index索引。
3.2. 属性
以该数组为基准
se = df['name']
print('se:\n', se)
print('se:\n', type(se))
#结果:
se:
stu0 zs
stu1 ls
stu2 ww
Name: name, dtype: object
se:
<class 'pandas.core.series.Series'>
- ndim维度 — Series结构为一维
- shape — 形状
- size — 数据个数
- dtypes和dtype ---- 返回数据类型
- index ---- 返回Series行索引
- columns ---- 返回Series列索引
- values ----- 返回数据 , 类型为numpy.ndarray(数组)
print('ndim:', se.ndim)
print('shape:', se.shape)
print('size:', se.size)
# print('itemsize:', se.itemsize) # 当前版本可能还有,但是未来要被删除!
print('dtype:', se.dtype) #
print('dtypes:', se.dtypes) # Series只有一列且内部的数据类型都是一样的,所以具有dtype
print('index:', se.index)
print('values:', se.values)
print('values:', type(se.values))
#结果:
ndim: 1
shape: (3,)
size: 3
dtype: object
dtypes: object
index: Index(['stu0', 'stu1', 'stu2'], dtype='object')
values: ['zs' 'ls' 'ww']
values: <class 'numpy.ndarray'>
3.3. 初始化
res = pd.Series(self.to_dict(user))
res = pd.Series(corr_ret, index=market_change_df.columns, name=benchmark_df.name)
res = pd.Series([0,1],index = ['a','b'])
res = pd.Series([2,3,4],index = ['c','d','e'])
res = pd.Series([1, 1, 1, 100, 100, 100, 100, 100, 100, 100]).sort_values(inplace=False)
res = pd.Series({"repopurpose": "xxx", "repoquantity": 2,"repoavgprice":13,"repoavgclose":12},name="sh603698")
res = pd.Series({"inspireway": "定向", "inspireproprotion": 2.3645,"initialprice":10.92},name="sh603698")
index | sh603698 | |
---|---|---|
0 | inspireway | 定向 |
1 | inspireproprotion | 2.3645 |
2 | initialprice | 10.92 |
#判断res是否为DataFrame或Series结构
if isinstance(res, (pd.Series, pd.DataFrame)):
xxxx
4. DataFrame常规使用方法
4.1. 初始化值
import pandas as pd
import numpy as np
df=pd.DataFrame([['A',1],['B',2],['C',5],['D',4],['E',10],['F',13],['G',8]],
columns=['col_1','col_2'],
index=list('abcdefg'))
返回结果
col_1 col_2
a A 1
b B 2
c C 5
d D 4
e E 10
f F 13
g G 8
4.2. 使用常量修改DataFrame列的值
使用一个常量对DataFrame列中的数据进行修改时,代码举例如下:
df1=df.copy()
df1['col_1']='H'
df1.loc[['a','c','d'],'col_2']=100 #将指定索引的列值进行修改
df1.iloc[4:,-1]=200
返回结果
col_1 col_2
a H 100
b H 2
c H 100
d H 100
e H 200
f H 200
g H 200
4.3. 使用List\array修改DataFrame列的值
当需要对DataFrame列中的多个值进行修改时,可以使用List或array等变量型数据来对其进行修改。具体代码如下:
df2=df.copy()
df2['col_1']=list(range(7))
df2.loc[df2.index<='d','col_2']=np.array([15,20,25,30])
df2.iloc[4:,-1]=np.array([10,5,0])
返回结果
col_1 col_2
a 0 15
b 1 20
c 2 25
d 3 30
e 4 10
f 5 5
g 6 0
4.4. 使用Series/DataFrame修改DataFrame列的值
除了以上两种数据类型之外,还可以使用Series型数据来修改DataFrame列的值。但使用这种方法时,需要索引对齐,否则会出错。具体举例如下:
df3=df.copy()
df3['col_1']=pd.Series([1,2,3,4,5,6,7]) #索引不对齐时不会报错,但没有成功修改列值。
#改为df3['col_1']=pd.Series([1,2,3,4,5,6,7],index=df3.index),可填充col_1列
df3.loc[['a','b','c'],'col_2']=pd.Series([100,200,300],index=list('abc'))
df3.iloc[3:,-1]=pd.Series([4000,5000,6000,7000],index=list('defg'))
print(df3)
返回结果
col_1 col_2
a NaN 100
b NaN 200
c NaN 300
d NaN 4000
e NaN 5000
f NaN 6000
g NaN 7000
5. DataFrame通过replace实现列替换
DataFrame对象自带的方法replace()也可以实现列值的修改。该方法中的参数主要有以下几个:
参数 | 作用 |
---|---|
to_replace | 确定需要修改列值的数据。可接受的数据类型有:str, regex, list, dict, Series, int, float, or None |
value | 指定修改后的值。可接受的数据类型有:scalar, dict, list, str, regex, default None |
inplace | 是否本地置换 |
limit | 指定前后填充的最大次数 |
regex | 正则表达式符号。如果需要在to_replace中使用字符串形式的正则表达式对数据进行筛选的话,需要将其设置为True。 |
method | 填充方式。‘pad’, ‘ffill’, ‘bfill’, None |
创建如下数据,具体如下:
df=pd.DataFrame([['A','A'],['B','B'],['C',5],['D',4]],
columns=['col_1','col_2'],
index=list('abcd'))
#df的结果如下:
col_1 col_2
a A A
b B B
c C 5
d D 4
5.1. 对整个DataFrame中的指定数据进行替换
#A替换为aaa,B替换为bbb,4替换为100
df_1=df.replace(to_replace=['A','B',4],value=['aaa','bbb',100])
#将A替换为AAAA
df_2=df.replace(to_replace='A',value='AAAA')
#将A替换为AAAAA,5替换为2000
df_3=df.replace(to_replace={"A":'AAAAA',5:2000})
#df的结果如下:
col_1 col_2
a aaa aaa
b bbb bbb
c C 5
d D 100
col_1 col_2
a AAAA AAAA
b B B
c C 5
d D 4
col_1 col_2
a AAAAA AAAAA
b B B
c C 2000
d D 4
5.2. 对DataFrame中的不同列指定不同的替换方式
#对于col_1列:将A替换为1,B替换为2
#对于col_2列:将A替换为100,B替换为200
df_4=df.replace({"col_1":{'A':1,'B':2},"col_2":{"A":100,"B":200}})
#df的结果如下:
col_1 col_2
a 1 100
b 2 200
c C 5
d D 4
5.3. 使用正则表达式筛选数据
#将A\B替换成new
df_5=df.replace(to_replace=r'[AB]',value='new',regex=True)
#df的结果如下:
col_1 col_2
a new new
b new new
c C 5
d D 4