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为基准
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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(数组)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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. 初始化方式
1 2 3 4 5 |
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. 属性
以该数组为基准
1 2 3 4 5 6 7 8 9 10 11 12 |
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(数组)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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. 初始化
1 2 3 4 5 6 7 8 |
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 |
1 2 3 |
#判断res是否为DataFrame或Series结构 if isinstance(res, (pd.Series, pd.DataFrame)): xxxx |
4. DataFrame常规使用方法
4.1. 初始化值
1 2 3 4 5 |
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')) |
返回结果
1 2 3 4 5 6 7 8 |
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列中的数据进行修改时,代码举例如下:
1 2 3 4 |
df1=df.copy() df1['col_1']='H' df1.loc[['a','c','d'],'col_2']=100 #将指定索引的列值进行修改 df1.iloc[4:,-1]=200 |
返回结果
1 2 3 4 5 6 7 8 |
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等变量型数据来对其进行修改。具体代码如下:
1 2 3 4 |
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]) |
返回结果
1 2 3 4 5 6 7 8 |
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列的值。但使用这种方法时,需要索引对齐,否则会出错。具体举例如下:
1 2 3 4 5 6 |
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) |
返回结果
1 2 3 4 5 6 7 8 |
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 |
创建如下数据,具体如下:
1 2 3 4 5 6 7 8 9 10 11 |
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中的指定数据进行替换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#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中的不同列指定不同的替换方式
1 2 3 4 5 6 7 8 9 10 11 |
#对于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. 使用正则表达式筛选数据
1 2 3 4 5 6 7 8 9 10 |
#将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 |
6. 参考
https://blog.csdn.net/aerfaqi/article/details/123489740
赞赏微信赞赏
支付宝赞赏