新pandas 模块

pandas 模块

该模块是python数据分析的核心模块,它主要提供了五大功能:

1.支持文件存取操作,支持数据库(sql)、html、json、pickle、csv(txt、excel)、sas、stata、hdf等。

2.支持增删改查、切片、高阶函数、分组聚合等单表操作,以及和dict、list的互相转换。

3.支持多表拼接合并操作。

4.支持简单的绘图操作。

5.支持简单的统计分析操作。

它的主要数据结构

Series数据结构类似于Numpy中的一维数组(现在一般不用了),DataFrame类似于多维表格数据结构。

大多数时候pandas是起到文件处理的作用,它的核心就是对numpy+xlrd模块做了一层封装。

Series数据结构

首先Series比较像列表(数组)和字典的结合体

基本格式如下

import pandas as pd
import numpy as np
df = pd.Series(np.array([1,2,3,4,5]))
print(df)
#结果为
"""
0    1
1    2
2    3
3    4
4    5
dtype: int32
"""

values属性的作用是返回数据结构中的实际数据部分(不包括索引)。对于DataFrame,values返回一个包含所有数据的二维数组,而对于Seriesvalues返回一个包含所有数据的一维数组。

格式如下

import pandas as pd
import numpy as np
df = pd.Series(np.array([1,2,3,4,5]))
print(df.values)
#结果为
"""
[1 2 3 4 5]
"""

对于Series目前仅做理解即可

DataFrame数据结构

1.date_range参数详解:

参数 详解
start 开始时间
end 结束时间
periods 时间长度
freq 时间频率,默认情况是"D",可选H(our),W(eek),B(usiness),S(emi-)M(onth),(min)T(es),S(econd),A(year),…

例子格式如下

import pandas as pd
dates = pd.date_range("20190101", periods=6, freq='M')
print(dates)
#结果为
"""
DatetimeIndex(['2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30',
               '2019-05-31', '2019-06-30'],
              dtype='datetime64[ns]', freq='M')
              """

这里我的freq='M'代表月末(Month End),生成的日期会是每个月的最后一天,然后这里的period指的是生成的日期数量。与end参数互斥,如果两者都没有指定,则需要指定statr

然后这里用numpy模块生成一个数组再用pandas模块添加列名

例子如下

#DataFrame与numpy数组的结合
import numpy as np
import pandas as pd

#这里生成一个6行4列的随机数组,元素取值范围在(0,1)之间,然后乘以10
values = np.random.rand(6, 4)*10

#生成一个包含6个月份的日期范围
dates = pd.date_range("20190101", periods=6, freq='M')

#定义DataFrame的列名
columns = ['c1', 'c2', 'c3', 'c4']

#使用values、dates和columns创建DataFrame
df = pd.DataFrame(data=values,index=dates, columns=columns)
#打印创建的DataFrame
print(df)

结果如图

这里详细讲解一下DataFrame内的参数

参数的格式

pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
参数 讲解
data 数据部分:可以是二维数组,Series对象,字典或字典的列表,结构化或记录数组等
index 行索引,就是给行添加数据
column 列索引,就是给列添加数据
dtype 指定数据框的数据类型。如果未提供,将根据数据推断
copy 默认为False。如果为True,则将数据复制到数据框。如果为False,则尽量避免复制。

最主要的三个参数是data、index、column

DataFrame属性的情况

属性 详解
dtype 查看数据类型
index 查看行序列或者索引(也可以理解为查看行的内容)
column 查看各列的标签
values 查看数据框内的数据,也即不含表头索引的数据
describe 查看数据每一列的极值,均值,中位数,只可用于数值型数据
transpose 转置,也可用T来操作
sort_index 排序,可按行或列index排序输出
sort_values 按数据值来排序

代码例子如下

#属性一览
import pandas as pd
import numpy as np
values = np.random.rand(6,4)*10
dates = pd.date_range("20230101", periods=6, freq="M")
columns = ["c1","c2","c3","c4"]
df = pd.DataFrame(values, index=dates,columns=columns)
# print(df)

print('*'*10)#这里打印符号方便查看

print(df.dtypes)#这里查看数据类型

print('*'*10)#这里打印符号方便查看

print(df.index)#这里查看行的内容

print('*'*10)#这里打印符号方便从查看

print(df.columns)#这里打印列的内容

print('*'*10)#这里打印符号方便查看

print(df.values)#查看数据框内的数据

print('*'*10)#这里打印符号方便查看

print(df.describe())#查看数据每一列的极值,均值,中位数,只可用于数据型数据

print('*'*10)#这里打印符号方便查看

print(df.T)#转置,这里的T的功能就是将列的内容和行的内容进行互相替换

print('*'*10)#这里打印符号方便查看

print(df.sort_index)#排序

print('*'*10)#这里打印符号方便查看

print(df.sort_values)#按数据值来排序

效果如图

DataFrame取值的情况

1.通过columns数据取值

现在获取columns数据为c1的数据

格式如下

import numpy as np
import pandas as pd
values = np.random.rand(6,4)*10
dates = pd.date_range("20230101",periods=6,freq="M")
columns = ['c1','c2','c3','c4']
df = pd.DataFrame(values, index=dates, columns=columns)
print(df[['c1']])#这里输出c1的数据
#结果为
"""
                  c1
2023-01-31  6.096437
2023-02-28  1.488695
2023-03-31  8.266699
2023-04-30  7.555657
2023-05-31  7.897073
2023-06-30  0.150620
"""

2.通过loc获取数据

通过自定义的行标签选择数据

格式如下

import numpy as np
import pandas as pd
values = np.random.rand(6,4)*10
data = pd.date_range("20230101",periods=6,freq='M')
column = ['c1','c2','c3','c4']
df = pd.DataFrame(values,index=data,columns=column)
# print(df)
print(df.loc['2023-01-31':'2023-02-28'])#获取行为2023-01-31和2023-02-28的数据

#结果为
"""
                  c1        c2        c3        c4
2023-01-31  6.406121  9.047321  5.457664  2.741886
2023-02-28  9.378504  0.122961  3.324112  2.723593
"""

还一种方法

格式如下

import numpy as np
import pandas as pd
values = np.random.rand(6,4)*10
data = pd.date_range("20230101",periods=6,freq='M')
column = ['c1','c2','c3','c4']
df = pd.DataFrame(values,index=data,columns=column)

print(df[0:2])#这里获取行的索引在0和2之间的数据

#结果为
"""
                  c1        c2        c3        c4
2023-01-31  3.496081  5.633354  4.338063  7.897088
2023-02-28  6.231203  2.464580  9.259144  5.170454
"""

3.通过逻辑判断取值

基本格式

import numpy as np
import pandas as pd

# 生成一个6行4列的随机数组,元素取值范围在[0, 1),然后乘以10
values = np.random.rand(6, 4) * 10

# 生成一个包含6个月份的日期范围
data = pd.date_range("20230101", periods=6, freq='M')

# 定义DataFrame的列名
columns = ['c1', 'c2', 'c3', 'c4']

# 使用values、dates和columns创建DataFrame
df = pd.DataFrame(values, index=data, columns=columns)

# 打印输出原始DataFrame
print("原始 DataFrame:\n", df)

# 选择满足 'c1' 列中大于 0 的行
selected_rows = df[df['c1'] > 0]

# 打印输出符合条件的行
print("\n选择满足条件的行:\n", selected_rows)

#结果为
"""
原始 DataFrame:
                   c1        c2        c3        c4
2023-01-31  1.491329  4.608074  7.323318  1.824254
2023-02-28  1.886686  4.220090  4.909640  6.038502
2023-03-31  1.173663  2.379967  4.051179  5.710181
2023-04-30  3.885409  7.762924  9.470510  3.961858
2023-05-31  5.761210  0.588241  8.785080  7.475626
2023-06-30  3.960443  0.503487  5.395907  6.931867

选择满足条件的行:
                   c1        c2        c3        c4
2023-01-31  1.491329  4.608074  7.323318  1.824254
2023-02-28  1.886686  4.220090  4.909640  6.038502
2023-03-31  1.173663  2.379967  4.051179  5.710181
2023-04-30  3.885409  7.762924  9.470510  3.961858
2023-05-31  5.761210  0.588241  8.785080  7.475626
2023-06-30  3.960443  0.503487  5.395907  6.931867
"""

例子格式如下

import numpy as np
import pandas as pd
values = np.random.rand(6,4)*10
data = pd.date_range("20230101",periods=6,freq='M')
column = ['c1','c2','c3','c4']
df = pd.DataFrame(values,index=data,columns=column)
print(df[df['c1']>0])#这里进行判断
#结果为
"""
                  c1        c2        c3        c4
2023-01-31  0.887502  8.715718  4.812277  2.894186
2023-02-28  7.595577  3.879889  4.856080  9.211648
2023-03-31  7.797549  8.983207  5.560610  5.388468
2023-04-30  0.171449  8.355725  3.301951  4.577735
2023-05-31  5.654572  7.429806  7.169636  4.452716
2023-06-30  4.468159  7.121082  8.999174  7.527340
"""

DataFrame值替换

1.iloc进行判断

iloc的第一个参数位置表示行的位置,第二个参数表示列的位置。

iloc[行的索引,列的索引]

这里将位于行的索引2,列的索引为3的数据变成0

例子如下

#DataFrame值替换的情况
import numpy as np
import pandas as pd
values = np.random.rand(6,4)*10
data = pd.date_range("2023-01-01",periods=6,freq='M')
column = ['c1', 'c2', 'c3', 'c4']
df = pd.DataFrame(values,index=data,columns=column)
df.iloc[2,3] = 0
print(df)

#结果为
"""

                  c1        c2        c3        c4
2023-01-31  9.552043  2.513891  4.328620  7.834606
2023-02-28  4.141166  4.652884  5.973346  4.699575
2023-03-31  0.126369  5.298674  1.507820  0.000000#这里就变成了0
2023-04-30  4.509388  5.697588  7.461601  3.162913
2023-05-31  7.137976  0.015132  4.529471  0.959858
2023-06-30  4.418833  5.175493  6.768822  1.341100
"""

还有一个特别的情况

例子如下


import numpy as np
import pandas as pd
values = np.random.rand(6, 4)*10
data = pd.date_range('2023-01-01', periods=6, freq='M')
column = ['c1', 'c2', 'c3', 'c4']
df = pd.DataFrame(values, index=data, columns=column)
df.iloc[0:2, 1:2] = 0#将行索引在0和2之间同时列索引在1和2之间的数据变成0
print(df)
#结果为
"""
                  c1        c2        c3        c4
2023-01-31  4.390027  0.000000  2.069853  1.293813
2023-02-28  2.847720  0.000000  8.532663  8.966715
2023-03-31  9.311313  5.470657  1.617050  5.193156
2023-04-30  9.809500  9.480820  9.174329  8.707713
2023-05-31  7.473565  9.687550  8.396161  5.165638
2023-06-30  2.207314  6.087769  6.353474  5.352209
"""

2.replace进行判断

replace方法用于替换数据框或列中的值,该方法的一般语法

DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')

参数讲解

参数 描述 类型 默认值
to_replace 要被替换的值 单一值、字典、列表、正则表达式 None
value 用于替换的新值 单一值、与to_replace长度相同的列表 None
inplace 是否在原地修改数据框 布尔值 None
limit 对于每个元素,最多替换的次数 整数 None
regex 是否将to_replace视为正则表达式 布尔值 None
method 当使用正则表达式时,指定匹配时的替换 方法 字符串 None

替换单个值的情况

import pandas as pd

df = pd.read_csv('test_data.csv', header=None)

# 替换 '1.4' 为 '123',最多替换2次
df1 = df.replace(to_replace=1.4, value=123)


# 打印替换后的数据框
print(df1)
"""
     0    1      2      3
0  5.1  NaN  123.0    0.2
1  4.9  3.0  123.0    0.2
2  4.7  3.2    NaN    0.2
3  7.0  3.2    4.7  123.0
4  6.4  3.2    4.5    1.5
5  6.9  3.1    4.9    NaN
"""

这里展示多个值替换

import pandas as pd

df = pd.read_csv('test_data.csv', header=None)

# 替换 '1.4' 为 '1400','5.1'为'1314', ’3.2‘为'521'
df1 = df.replace({1.4: 1400, 5.1: 1314, 3.2: 521})

# 打印替换后的数据框
print(df1)
#结果为
"""
        0      1       2       3
0  1314.0    NaN  1400.0     0.2
1     4.9    3.0  1400.0     0.2
2     4.7  521.0     NaN     0.2
3     7.0  521.0     4.7  1400.0
4     6.4  521.0     4.5     1.5
5     6.9    3.1     4.9     NaN
"""

读取CSV文件

读取CSV文件也可以理解为pandas操作表格

这里简单了解一个模块io,该模块中的方法StringIO会将指定的内容读入到内存中,相当于变成了文件

例子如下

from io import StringIO

test_data = '''
5.1,,1.4,0.2
4.9,3.0,1.4,0.2
4.7,3.2,,0.2
7.0,3.2,4.7,1.4
6.4,3.2,4.5,1.5
6.9,3.1,4.9,'''
print(test_data)
test_data = StringIO(test_data)#把test_data读入内存,相当于变成了文件
print(test_data)
#结果为
"""
5.1,,1.4,0.2
4.9,3.0,1.4,0.2
4.7,3.2,,0.2
7.0,3.2,4.7,1.4
6.4,3.2,4.5,1.5
6.9,3.1,4.9,转换前的数据
<_io.StringIO object at 0x0000025E0EDA7D90>"""#转换后的情况

这里将上面转换的文件进行读取

import pandas as pd
from io import StringIO

# 定义 CSV 格式的文本数据
test_data = '''
5.1,,1.4,0.2
4.9,3.0,1.4,0.2
4.7,3.2,,0.2
7.0,3.2,4.7,1.4
6.4,3.2,4.5,1.5
6.9,3.1,4.9,'''

# 使用 StringIO 将文本数据读入内存,创建一个类文件对象
test_data = StringIO(test_data)

# 使用 pd.read_csv 读取 CSV 数据,header=None 表示数据没有头部信息
df = pd.read_csv(test_data, header=None)

# 为 DataFrame 添加列名
df.columns = ['c1', 'c2', 'c3', 'c4']

# 打印输出结果
print(df)

#结果为
"""
    c1   c2   c3   c4
0  5.1  NaN  1.4  0.2
1  4.9  3.0  1.4  0.2
2  4.7  3.2  NaN  0.2
3  7.0  3.2  4.7  1.4
4  6.4  3.2  4.5  1.5
5  6.9  3.1  4.9  NaN
"""

切记这个代码中的header=None它的作用当读取过来的数据没有头部信息时,pandas将为每列分配默认的整数列标签。然后我还给DataFrame添加了列名,同理我也可以用df.index给它添加行名(有些BUG)。

read_csv函数

该函数是用于读取csv文件而存在的,它的参数主要的有三个

1.filepath_or_buffer该参数是指定要读取的文件路径或文件对象

2.sep该参数是指定字段之间的分隔符。默认情况是逗号,可以使用其他字符例如制表符\t

3.header该参数的作用是指定用做列名的行数,默认是'infer',表示自动推断。如果文件中没有列名,可以设置为'None'。

同时切记一下如果读取的文件与pandas的格式不一样,就会出现报错的现象,解决就需要查看文件的问题,如果无法找到问题,那么就需要使用error_bad_lines=False参数,但是这个参数会导致部分数据的丢失,因此最好检查并修复数据文件。

导入文件的格式如下

import pandas as pd
df1 = pd.read_csv('test_data.csv', header=None)
df1.columns = ['c1', 'c2', 'c3', 'c4']
print(df1)
#结果为
"""
     c1   c2   c3   c4
0   5.1  NaN  1.4  0.2
1   4.9  3.0  1.4  0.2
2   4.7  3.2  NaN  0.2
3   7.0  3.2  4.7  1.4
4   6.4  3.2  4.5  1.5
5   6.9  3.1  4.9  NaN
6   '''  NaN  NaN  NaN
"""

然后这里的数据就有缺失的情况

这里将缺失的数据进行处理

dropna函数

axis参数

格式如下

import pandas as pd
df1 = pd.read_csv('test_data.csv', header=None)
df1.columns = ['c1', 'c2', 'c3', 'c4']
print(df1)#这里将没有处理前的数据打印出来进行对比


#缺失值处理
df = df1.dropna(axis=1)#这里将丢失的文件内容,按列进行处理
print(df)
#结果为
"""
    c1   c2   c3   c4
0  5.1  NaN  1.4  0.2
1  4.9  3.0  1.4  0.2
2  4.7  3.2  NaN  0.2
3  7.0  3.2  4.7  1.4
4  6.4  3.2  4.5  1.5
5  6.9  3.1  4.9  NaN#没处理前的数据

    c1
0  5.1
1  4.9
2  4.7
3  7.0
4  6.4
5  6.9#处理后的数据
"""

通过结果可以看出如果哪一列的数据为NaN那么这一整列都会被删除不显示。

之所以按照一整列进行查找和axis这个参数有关,当这个axis等于0就按行来进行处理,当这个axis等于1就按列来进行处理。

axis参数等于0的情况代码如下

import pandas as pd
df1 = pd.read_csv('test_data.csv',header=None)
df1.columns = ['c1', 'c2', 'c3', 'c4']
print(df1)

#缺失值处理
df = df1.dropna(axis=0)#这里将丢失的文件内容,按照行
print(df)
#结果为
"""
    c1   c2   c3   c4
0  5.1  NaN  1.4  0.2
1  4.9  3.0  1.4  0.2
2  4.7  3.2  NaN  0.2
3  7.0  3.2  4.7  1.4
4  6.4  3.2  4.5  1.5
5  6.9  3.1  4.9  NaN#这里是处理前的数据


    c1   c2   c3   c4
1  4.9  3.0  1.4  0.2
3  7.0  3.2  4.7  1.4
4  6.4  3.2  4.5  1.5#这里是处理后的数据
"""

how参数

该参数会删除行和列中有NaN的行和列

例子格式如下

import pandas as pd
df = pd.read_csv('test_data.csv',header=None,sep=',')
df.columns = ['c1', 'c2', 'c3', 'c4']
print(df)
df = df.dropna(how='all')
print(df)
#结果为
"""
#修改前
    c1   c2   c3   c4
0  5.1  NaN  1.4  0.2
1  4.9  3.0  1.4  0.2
2  4.7  3.2  NaN  0.2
3  7.0  3.2  4.7  1.4
4  6.4  3.2  4.5  1.5
5  6.9  3.1  4.9  NaN
#修改后
    c1   c2   c3   c4
0  5.1  NaN  1.4  0.2
1  4.9  3.0  1.4  0.2
2  4.7  3.2  NaN  0.2
3  7.0  3.2  4.7  1.4
4  6.4  3.2  4.5  1.5
5  6.9  3.1  4.9  NaN
"""

how参数有两个值,第一个any值是默认值,表示只要某一行或列中存在任何缺失值,就删除该行或列。

第二个all值,表示只有当某一行或列中的所有值都是缺失值时,才删除该行或列。

thresh参数

该参数用于指定非缺失值的最小数量,当某一行或列的非缺失值小于这个最小数量,该行或列将被删除。

例子如下

import pandas as pd
df = pd.read_csv('test_data.csv',header=None, sep=',')
df.columns = ['c1', 'c2', 'c3', 'c4']
print(df)#修改前的数据
df = df.dropna(thresh=4)#这里添加一个限制,当某一行或列缺失值小于这个量就将其删除掉
print(df)#修改后的数据
#结果为
"""
#修改前的数据
    c1   c2   c3   c4
0  5.1  NaN  1.4  0.2
1  4.9  3.0  1.4  0.2
2  4.7  3.2  NaN  0.2
3  7.0  3.2  4.7  1.4
4  6.4  3.2  4.5  1.5
5  6.9  3.1  4.9  NaN

#修改后的数据
    c1   c2   c3   c4
1  4.9  3.0  1.4  0.2
3  7.0  3.2  4.7  1.4
4  6.4  3.2  4.5  1.5"""

subset参数

该参数用于指定应该考虑哪些列或行来进行缺失值的删除。具体就是subset参数允许指定特定的行或列的标签

指定列的情况

例子格式如下

import pandas as pd
df = pd.read_csv('test_data.csv', header=None, sep=',')
df.columns = ['c1', 'c2', 'c3', 'c4']
print(df)#修改前的数据
df = df.dropna(subset=['c2'])#从列c2删除带有NaN值的行
print(df)#修改后的数据
#结果为
"""
#修改前的数据
    c1   c2   c3   c4
0  5.1  NaN  1.4  0.2
1  4.9  3.0  1.4  0.2
2  4.7  3.2  NaN  0.2
3  7.0  3.2  4.7  1.4
4  6.4  3.2  4.5  1.5
5  6.9  3.1  4.9  NaN

#修改后的数据
    c1   c2   c3   c4
1  4.9  3.0  1.4  0.2
2  4.7  3.2  NaN  0.2
3  7.0  3.2  4.7  1.4
4  6.4  3.2  4.5  1.5
5  6.9  3.1  4.9  NaN
"""

subset参数在判断c2列是,c2列的0行有NaN的值所以整个行都删除了。

注意一定的是subset参数主要用于选择特定的列来进行缺失值的处理,而不是用于选择特定的行

给NaN值进行填充

填充需要用到一个方法fillna

例子如下

import pandas as pd
df = pd.read_csv('test_data.csv', header=None,sep=',')
df.columns = ['c1', 'c2', 'c3', 'c4']
print(df)#修改前的数据
df = df.fillna(value="jun")#这里将jun这个数据替换掉NaN值
print(df)#修改后的数据
#结果为
"""
#修改前的数据
    c1   c2   c3   c4
0  5.1  NaN  1.4  0.2
1  4.9  3.0  1.4  0.2
2  4.7  3.2  NaN  0.2
3  7.0  3.2  4.7  1.4
4  6.4  3.2  4.5  1.5
5  6.9  3.1  4.9  NaN

#修改后的数据
    c1   c2   c3   c4
0  5.1  jun  1.4  0.2
1  4.9  3.0  1.4  0.2
2  4.7  3.2  jun  0.2
3  7.0  3.2  4.7  1.4
4  6.4  3.2  4.5  1.5
5  6.9  3.1  4.9  jun
"""

合并数据

首先用pandas模块和numpy模块生成一个行为3,列为3的数组

例子如下

import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.zeros((3,3)))#这里将numpy模块生成的数组添加到pandas的多维里面,不过zeros生成的数组元素初始化都是零
print(df1)

df2 = pd.DataFrame(np.ones((2,3)))#这里将numpy模块生成的数组添加到pandas的多维里面,不过ones生成的数组元素初始化都是一
print(df2)
#结果为
"""
#zeros生成的
     0    1    2
0  0.0  0.0  0.0
1  0.0  0.0  0.0
2  0.0  0.0  0.0

#ones生成的
     0    1    2
0  1.0  1.0  1.0
1  1.0  1.0  1.0
"""

上面的代码注意一下就是zerosones这里两个方法都是用于创建数组,只是两者创建的数组里面的元素初始化值是不一样的。

concat方法合并例子代码如下

import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.zeros((3,3)))#这里将numpy模块生成的数组添加到pandas的多维里面,不过zeros生成的数组元素初始化都是零
print(df1)

df2 = pd.DataFrame(np.ones((2,3)))#这里将numpy模块生成的数组添加到pandas的多维里面,不过ones生成的数组元素初始化都是一
print(df2)

df3 = pd.concat((df1,df2))#使用concat方法将这两个数组进行合并
print(df3)
#结果如下
"""
#zeros生成的
     0    1    2
0  0.0  0.0  0.0
1  0.0  0.0  0.0
2  0.0  0.0  0.0

#ones生成的
     0    1    2
0  1.0  1.0  1.0
1  1.0  1.0  1.0

#使用concat方法后的结果
     0    1    2
0  0.0  0.0  0.0
1  0.0  0.0  0.0
2  0.0  0.0  0.0
0  1.0  1.0  1.0
1  1.0  1.0  1.0
"""

这里的合并使用了concat这个方法,该方法内有一个参数axis决定它按照什么形式进行合并。

1、axis=0(默认值):

  • 在纵向(垂直)方向上进行连接,即沿着行的方向连接。
  • 对于DataFrame,表示按行连接,增加行数。

2、axis=1:

  • 在横向(水平)方向上进行连接,即沿着列的方向连接。
  • 对于DataFrame,表示按列连接,增加列数。

axis=0和1的例子代码:

#合并处理
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.zeros((3,3)))#这里将numpy模块生成的数组添加到pandas的多维里面,不过zeros生成的数组元素初始化都是零
print(df1)

df2 = pd.DataFrame(np.ones((2,3)))#这里将numpy模块生成的数组添加到pandas的多维里面,不过ones生成的数组元素初始化都是一
print(df2)

df3 = pd.concat((df1, df2), axis=0)#使用concat方法将这两个数组进行合并
print(df3)#这里输出axis参数等于零的情况
df4 = pd.concat((df1, df2), axis=1)#使用concat方法将这两个数组进行合并
print(df4)#这里输出axis参数等于一的情况

#结果为
"""
#zeros生成的数组
     0    1    2
0  0.0  0.0  0.0
1  0.0  0.0  0.0
2  0.0  0.0  0.0

#ones生成的数组
     0    1    2
0  1.0  1.0  1.0
1  1.0  1.0  1.0

#这里是concat方法参数axis等于零的情况
     0    1    2
0  0.0  0.0  0.0
1  0.0  0.0  0.0
2  0.0  0.0  0.0
0  1.0  1.0  1.0
1  1.0  1.0  1.0

#这里是concat方法参数axis等于一的情况
     0    1    2    0    1    2
0  0.0  0.0  0.0  1.0  1.0  1.0
1  0.0  0.0  0.0  1.0  1.0  1.0
2  0.0  0.0  0.0  NaN  NaN  NaN
"""

_append方法合并例子

代码如下

import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.zeros((2, 3)))
df2 = pd.DataFrame(np.ones((3, 2)))
print(df1)
print(df2)
df3 = df1._append(df2)# 这里使用append合并列
print(df3)
#结果为
"""
#zeros生成的数组
     0    1    2
0  0.0  0.0  0.0
1  0.0  0.0  0.0

#ones生成的数组
     0    1
0  1.0  1.0
1  1.0  1.0
2  1.0  1.0
3  1.0  1.0
4  1.0  1.0

#这里使用_append进行合并
     0    1    2
0  0.0  0.0  0.0
1  0.0  0.0  0.0
0  1.0  1.0  NaN
1  1.0  1.0  NaN
2  1.0  1.0  NaN
3  1.0  1.0  NaN
4  1.0  1.0  NaN
"""

该方法的合并就是将这两个数组直接合并,行与行合并,列与列合并。

导入导出数据

1.读取文件

主要的格式

read_文件类型(参数)

参数表格

参数 详解
sep 指定分隔符,可用正则表达式如'\s+'
header=None 指定文件无行名
name 指定列名
index_col 指定某列作为索引
skip_row 指定跳过某些行
na_values 指定某些字符串表示缺失值
parse_dates 指定某些列是否被解析为日期,布尔值或列表
  1. CSV 文件:
    • 使用 pd.read_csv 读取逗号分隔的文本文件。
    • 示例:pd.read_csv('file.csv')
  2. Excel 文件:
    • 使用 pd.read_excel 读取 Excel 文件。
    • 示例:pd.read_excel('file.xlsx')
  3. JSON 文件:
    • 使用 pd.read_json 读取 JSON 文件。
    • 示例:pd.read_json('file.json')
  4. SQL 数据库:
    • 使用 pd.read_sql 从 SQL 数据库读取数据。
    • 示例:pd.read_sql('SELECT * FROM table', connection)
  5. HTML 表格:
    • 使用 pd.read_html 从 HTML 表格中提取数据。
    • 示例:tables = pd.read_html('url or file')
  6. Parquet 文件:
    • 使用 pd.read_parquet 读取 Apache Parquet 文件。
    • 示例:pd.read_parquet('file.parquet')
  7. Feather 文件:
    • 使用 pd.read_feather 读取 Feather 文件。
    • 示例:pd.read_feather('file.feather')
  8. HDF5 文件:
    • 使用 pd.read_hdf 读取 HDF5 文件。
    • 示例:pd.read_hdf('file.h5')
  9. Msgpack 文件:
    • 使用 pd.read_msgpack 读取 Msgpack 文件。
    • 示例:pd.read_msgpack('file.msg')
  10. Stata 文件:
    • 使用 pd.read_stata 读取 Stata 文件。
    • 示例:pd.read_stata('file.dta')

例子如下

# 导入数据(csv文件例子)
import pandas as pd
df1 = pd.read_csv('test_data.csv', header=None)
print(df1)
#结果为
"""
     0    1    2    3
0  5.1  NaN  1.4  0.2
1  4.9  3.0  1.4  0.2
2  4.7  3.2  NaN  0.2
3  7.0  3.2  4.7  1.4
4  6.4  3.2  4.5  1.5
5  6.9  3.1  4.9  NaN
"""

2.写入文件

这里以csv文件为例子

导出文件

import pandas as pd
df = pd.read_csv('test_data.csv', header=None)
df1 = df.dropna(how='any')
print(df1)#将缺失值删除后的数据打印查看
# df1.to_csv('test1.csv')
df1.index = ['第一行', '第二行', '第三行']#给新文件的行进行更换
df1.columns = ['第一列', '第二列', '第三列', '第四列']#给新文件的列进行更换
print(df1)#这里将更换后的数据打印查看
df1.to_csv('test1.csv')#这里将文件导出
#结果为
"""
#这是缺失值处理后的情况
     0    1    2    3
1  4.9  3.0  1.4  0.2
3  7.0  3.2  4.7  1.4
4  6.4  3.2  4.5  1.5

#这是更换后的情况
     第一列  第二列  第三列  第四列
第一行  4.9  3.0  1.4  0.2
第二行  7.0  3.2  4.7  1.4
第三行  6.4  3.2  4.5  1.5
"""

文件导出的图片

上面是不带参数的情况

导出文件方法参数的情况

参数 详解
sep 分隔符的指定,用于指定用什么分隔符
na_rep 指定缺失值转换的字符串,默认为空字符串
header=False/True 当此参数等于False时导出的文件不会将列名一起导出,当此参数等于True时导出的文件会将列名一起导出(默认值是True)
index=False/True 当此参数等于False时导出的文件不会将行名一起导出,当此参数等于True时导出的文件会将行名一起导出(默认值是True)
cols 指定输出的列,传入列表

主要的参数有sepheaderindex这三个

pandas读取json文件

虽然pandas可以读取json文件,但是一般情况是不用它的。

基本的格式如下

import pandas as pd
strtext = '[{"ttery":"min","issue":"20130801-3391","code":"8,4,5,2,9","code1":"297734529","code2":null,"time":1013395466000},\
{"ttery":"min","issue":"20130801-3390","code":"7,8,2,1,2","code1":"298058212","code2":null,"time":1013395406000},\
{"ttery":"min","issue":"20130801-3389","code":"5,9,1,2,9","code1":"298329129","code2":null,"time":1013395346000},\
{"ttery":"min","issue":"20130801-3388","code":"3,8,7,3,3","code1":"298588733","code2":null,"time":1013395286000},\
{"ttery":"min","issue":"20130801-3387","code":"0,8,5,2,7","code1":"298818527","code2":null,"time":1013395226000}]'

df = pd.read_json(strtext, orient='records')#这里进行读取
print(df)
#结果为
"""
  ttery          issue       code      code1  code2           time
0   min  20130801-3391  8,4,5,2,9  297734529    NaN  1013395466000
1   min  20130801-3390  7,8,2,1,2  298058212    NaN  1013395406000
2   min  20130801-3389  5,9,1,2,9  298329129    NaN  1013395346000
3   min  20130801-3388  3,8,7,3,3  298588733    NaN  1013395286000
4   min  20130801-3387  0,8,5,2,7  298818527    NaN  1013395226000

"""

在方法read_json方法中有一个参数orient,它有五个值,然后这五个值对应着读取时不同的形式

参数 详解
split 将JSON对象拆分为表的字典。
records 将JSON数组视为记录的列表。
index 将JSON对象的键视为DataFrame的索引。
columns 将JSON对象的值视为DataFrame的列。
values 将JSON对象的值视为数据。
table 将JSON对象解释为包含表格的对象。
None 自动检测输入的数据结构

pandas模块查看类型以及修改类型

在pandas中,可以使用astype方法来转换列的数据类型,而要查看列的数据类型,可以使用dtype属性。

这里我有一个需求就是将文件读取的数据类型进行转换成浮点型,同时进行四舍五入保留一位浮点数。

例子如下

def liexi(liexi_data):#这个函数进行数据类型的转换,同时进行四舍五入

    # 读取数据
    df = pd.read_csv(liexi_data)


    # 修改数据'score'列的类型
    df['score'] = df['score'].astype(float)

    # 将修改后的数据'score'列进行四舍五入保留一位浮点数,需要用到pandas模块里面的round方法
    df['score'] = df['score'].round(1)

修改后的情况如下

posted @ 2023-11-27 15:38  scxlzb  阅读(6)  评论(0编辑  收藏  举报