Pandas库DataFrame_Series入门

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

6. 参考

https://blog.csdn.net/aerfaqi/article/details/123489740

发表评论

邮箱地址不会被公开。 必填项已用*标注