Python—padas(DataFrame)的常用 *** 作

Python—padas(DataFrame)的常用 *** 作,第1张

我们先说一下DataFrame是什么:

1、DataFrame是一种数据框结构,相当于是一个矩阵形式,单元格可以存放数值、字符串等,这和excel表很像;

2、DataFrame是有 行(index)和 列(columns)可以设置的;

有了示例,我们就能明白创建时需要传入数据,指定index(行索引名)和columns(列名);

在我们需要将单个元素的字典直接转为DataFrame时,程序会报错,需要适当做些转换,指定行索引或者列索引才行;

在增加列的时候我们用到了一个索引loc,后面我们再详细对loc进行说明,此处先知道可以这样使用。

文本字符串数据处理之前,一定要先转为字符(str)再进行处理

loc 和 iloc如果容易记混,你就取巧记忆,index是索引

所以iloc则是依据位置索引进行取数,没有i的则是按照名称进行提取数据

原谅我很懒,比较喜欢这样框架式的笔记,所以文字就会比较少(#^^#)!!!

先来创建一个Series和一个DataFrame

根据指定的key(一个行索引或列索引)来获取数据,key不存在则返回default值,类似于python的字典。

Seriesget 时,key为行索引,返回一个标量或default值

DataFrameget 时,key为列索引,返回一列数据或default值

根据标签或布尔数组定位数据

功能和使用方法与 loc 一样,请看下面的 loc 介绍

根据数字(坐标系)或布尔数组定位位置

功能和使用方法与 iloc 一样,请看下面的 iloc 介绍

根据标签或布尔数组定位数据

loc[index[, column]]

index可以是单个行标签、也可以是包含多个行标签的列表、行标签的切片、bool数组

column可以是单个列标签、也可以是包含多个列标签的列表、列标签的切片、bool数组

注意⚠️:loc里的切片和python的切片不一样,python里是左闭右开(即不包含结束值),但是loc是左闭右闭。

注意⚠️:但是在iloc里的切片就和python的切片一样,即符合左闭右开。

根据数字(坐标系)或布尔数组定位位置,使用方法和loc类似,只是这里用的是坐标

DataFrame和iloc类似,只是使用的是坐标轴获取数据。

注意⚠️:loc里的切片和python的切片不一样,python里是左闭右开(即不包含结束值),但是loc是左闭右闭。

注意⚠️:但是在iloc里的切片就和python的切片一样,即符合左闭右开。

返回一个迭代器

如果是Series,返回的是包含values的迭代器;

如果是DataFrame,返回的是包含列名的迭代器

返回一个可迭代对象,这个对象里的元素内容为一个元组(索引, 值)

和python字典的items()方法有些像

和 items() 功能一样

返回对象的索引

如果是Series,则 Serieskeys() 和 Seriesindex 返回结果一样,都返回Series的索引;

如果是DataFrame,则 dfkeys() 返回的是列索引, dfindex 返回的是行索引。

根据索引删除元素,返回删除的数值。

与python里listpop()相似。

注意⚠️:此方法会改变原Series的数据,如果是DataFrame,则item需要指定列名

目前看来只对包含一个元素的Series管用 返回这个元素的值

注意⚠️:DataFrame没有item()方法

选择MultiIndex特定级别的数据,即多层次索引时筛选数据

参数介绍:

直接上实例:

df = pdDataFrame(nprandomrandn(5,3),index = list('abcde'),columns = ['one','two','three']) #创建一个数据框

df 内容

获取所有的列名,并形成列表:list(dfkeys())

获取所有的行名,并形成列表:list(dfindex)

如果要获得某一个元素的具体位置可以使用:npwhere("条件"),如:npwhere(df >0)

第一个arrary代表第几行,第二个代表第几列。

如,如何条件的元素存在在:第一行第三列,第三行第一列,

在进行下面的题目 *** 作时,一定要先导入上面的两个数据分析包 pandas、numpy

1 如何用Python的列表创建一个series

输出:

一个series是一个一维的标记数组,可以容纳任何数据类型(整数、字符串、浮点数、Python对象等)。必须记住,与Python列表不同,一个series总是包含相同类型的数据。

2如何使用列表创建一个DataFrame

输出:

3如何使用Series 字典对象生成 DataFrame

输出:

4如何在pandas中创建一个空的DataFrame?

要创建一个完全空的pandas dataframe,我们使用以下 *** 作:

输出:

已知有这样的数据,如何进行查看

输出:

2如何查看尾部数据

3如何快速查看数据的统计摘要

4如何查询索引和列名

1简述Pandas Index

在panda中建立索引意味着简单地从DataFrame中选择特定的数据行和列。

pandas支持四种类型的多轴索引,它们是:

它们统称为索引器。这些是迄今为止索引数据最常见的方法。这四个函数有助于从DataFrame获取元素、行和列。

2Pandas 定义重新索引(Reindexing)

重新索引会更改DataFrame的行标签和列标签。重新索引意味着使数据符合特定轴上给定的一组标签。

多个 *** 作可以通过像这样的索引来完成:

输出:

3如何设置索引?

panda set_index() 是一种将列表、序列或dataframe设置为dataframe索引的方法。

语法:

DataFrameset_index(keys, inplace=False)

参数:

改变索引列

在本例中,名称列被用作DataFrame的索引列

输出:

如输出图像所示,以前索引列是一系列数字

Before Operation

After Operation

4如何重置索引

Pandas Seriesreset_index()

函数的作用是:生成一个新的DataFrame或带有重置索引的Series。

例1: 使用 Seriesreset_index() 函数重置给定Series对象的索引

输出:

现在,我们将使用Seriesreset_index()函数来重置给定的series对象的索引

输出 :

从输出中可以看到,该 Seriesreset_index() 函数已将给定Series对象的索引重置为默认值。它保留了索引,并将其转换为列。

11先创建数据:

12选择单列,产生 Series

详见 按标签选择 。

21用标签提取一行数据:

详见 按位置选择 。

31用整数位置选择:

41用单列的值选择数据:

51用索引自动对齐新增列的数据:

1如何得到一个数列的最小值、第25百分位、中值、第75位和最大值

输出:

Pandas dataframemean(axis=None) 函数返回所请求轴(axis=0代表对列进行求平均值,axis=1代表对行进行求平均值)的值的平均值。

示例: 使用 mean() 函数查找索引轴上所有观测值的平均值。

输出:

让我们使用datafame mean()函数来查找索引轴上的平均值。

3如何将函数应用到DataFrame中的每个数据元素

可以使用 apply() 函数以便将函数应用于给定dataframe中的每一行。让我们来看看我们完成这项任务的方式。

实例:

输出:

4如何在panda中获得一个DataFrame的行数和列数

输出:

获取df的行和列计数

输出:

5如何在panda DataFrame中获得列值的总和

Pandas dataframesum() 函数返回所请求轴的值的和

语法: DataFramesum(axis=None, skipna=None, )

参数:

示例1: 使用 sum() 函数查找索引轴上所有值的总和

现在求出沿索引轴的所有值的和。我们将跳过计算和时的NaN值。

输出:

如何将新行追加到pandas DataFrame?

Pandas dataframeappend() 函数的作用是:将其他dataframe的行追加到给定的dataframe的末尾,返回一个新的dataframe对象。

语法:

DataFrameappend( ignore_index=False,)

参数:

示例1: 创建两个数据框,然后将第二个附加到第一个。

现在将df2附加到df1的末尾

输出:

请注意,第二个DataFrame的索引值保留在附加的DataFrame中。如果我们不希望发生这种情况,则可以设置ignore_index = True。

输出 :

“group by” 指的是涵盖下列一项或多项步骤的处理流程:

详见 分组 。

输出:

1先分组,再用 sum() 函数计算每组的汇总数据:

输出:

2多列分组后,生成多层索引,也可以应用 sum 函数:

输出:

如何将numpy数组转换为给定形状的DataFrame

输出:

输出:

透视表是一种可以对数据动态排布并且分类汇总的表格格式,在pandas中它被称作pivot_table。

pivot_table(data, values=None, index=None, columns=None)

参数:

详见: 数据透视表

打印输出:

用上述数据生成数据透视表非常简单:

返回结果:

1如何将列添加到pandas DataFrame?

源数据:

输出:

输出:

2如何向panda DataFrame添加索引、行或列

向DataFrame添加索引

如果您创建了一个DataFrame, panda允许将输入添加到索引参数中。它将确保您拥有所需的索引。否则,在默认情况下,DataFrame包含一个数值索引,该索引从0开始,在DataFrame的最后一行结束。

向DataFrame添加行、列

我们可以使用loc、iloc和ix将行、列插入到DataFrame中。

添加具有特定索引名的行:

输出:

3如何在panda DataFrame上进行迭代

您可以通过结合使用for循环和对DataFrame的iterrows()调用来遍历DataFrame的行。

输出:

4我们如何排序DataFrame?

我们可以通过以下几种有效地在DataFrame中执行排序:

(1)按标签

可以使用sort_index()方法对数据dataframe进行排序。可以通过传递axis参数和排序顺序来实现。默认情况下,按升序对行标签进行排序。

用pandas中的DataFrame时选取行或列:

import numpy as npimport pandas as pdfrom pandas import Sereis, DataFrameser = Series(nparange(3))data = DataFrame(nparange(16)reshape(4,4),index=list('abcd'),columns=list('wxyz'))data['w'] #选择表格中的'w'列,使用类字典属性,返回的是Series类型dataw #选择表格中的'w'列,使用点属性,返回的是Series类型data[['w']] #选择表格中的'w'列,返回的是DataFrame类型data[['w','z']] #选择表格中的'w'、'z'列data[0:2] #返回第1行到第2行的所有行,前闭后开,包括前不包括后data[1:2] #返回第2行,从0计,返回的是单行,通过有前后值的索引形式,

#如果采用data[1]则报错dataix[1:2] #返回第2行的第三种方法,返回的是DataFrame,跟data[1:2]同data['a':'b'] #利用index值进行切片,返回的是前闭后闭的DataFrame,

#即末端是包含的

datairow(0) #取data的第一行dataicol(0) #取data的第一列datahead() #返回data的前几行数据,默认为前五行,需要前十行则datahead(10)datatail() #返回data的后几行数据,默认为后五行,需要后十行则datatail(10)seriget_value(0) #选取ser序列中的第一个seriget_value(-1) #选取ser序列中的最后一个,这种轴索引包含索引器的series不能采用ser[-1]去获取最后一个,这会引起歧义。datailoc[-1] #选取DataFrame最后一行,返回的是Seriesdatailoc[-1:] #选取DataFrame最后一行,返回的是DataFramedataloc['a',['w','x']] #返回‘a’行'w'、'x'列,这种用于选取行索引列索引已知dataiat[1,1] #选取第二行第二列,用于已知行、列位置的选取。123456789101112131415161718192021222324252627282930313233343536373839404142

下面是简单的例子使用验证:

import pandas as pdfrom pandas import Series, DataFrame

import numpy as np

data = DataFrame(nparange(15)reshape(3,5),index=['one','two','three'],columns=['a','b','c','d','e'])

data

Out[7]:

a b c d eone 0 1 2 3 4two 5 6 7 8 9three 10 11 12 13 14#对列的 *** 作方法有如下几种dataicol(0) #选取第一列E:\Anaconda2\lib\site-packages\spyder\utils\ipython\start_kernelpy:1: FutureWarning: icol(i) is deprecated Please use iloc[:,i] # -- coding: utf-8 --Out[35]:

one 0two 5three 10Name: a, dtype: int32

data['a']

Out[8]:

one 0two 5three 10Name: a, dtype: int32

dataaOut[9]:

one 0two 5three 10Name: a, dtype: int32

data[['a']]

Out[10]:

aone 0two 5three 10dataix[:,[0,1,2]] #不知道列名只知道列的位置时Out[13]:

a b cone 0 1 2two 5 6 7three 10 11 12dataix[1,[0]] #选择第2行第1列的值Out[14]:

a 5Name: two, dtype: int32

dataix[[1,2],[0]] #选择第2,3行第1列的值Out[15]:

atwo 5three 10dataix[1:3,[0,2]] #选择第2-4行第1、3列的值Out[17]:

a ctwo 5 7three 10 12dataix[1:2,2:4] #选择第2-3行,3-5(不包括5)列的值Out[29]:

c dtwo 7 8dataix[dataa>5,3]

Out[30]:

three 13Name: d, dtype: int32

dataix[datab>6,3:4] #选择'b'列中大于6所在的行中的第4列,有点拗口Out[31]:

dthree 13dataix[dataa>5,2:4] #选择'a'列中大于5所在的行中的第3-5(不包括5)列Out[32]:

c dthree 12 13dataix[dataa>5,[2,2,2]] #选择'a'列中大于5所在的行中的第2列并重复3次Out[33]:

c c cthree 12 12 12#还可以行数或列数跟行名列名混着用dataix[1:3,['a','e']]

Out[24]:

a etwo 5 9three 10 14dataix['one':'two',[2,1]]

Out[25]:

c bone 2 1two 7 6dataix[['one','three'],[2,2]]

Out[26]:

c cone 2 2three 12 12dataix['one':'three',['a','c']]

Out[27]:

a cone 0 2two 5 7three 10 12dataix[['one','one'],['a','e','d','d','d']]

Out[28]:

a e d d done 0 4 3 3 3one 0 4 3 3 3#对行的 *** 作有如下几种:data[1:2] #(不知道列索引时)选择第2行,不能用data[1],可以用dataix[1]Out[18]:

a b c d etwo 5 6 7 8 9datairow(1) #选取第二行Out[36]:

a 5b 6c 7d 8e 9Name: two, dtype: int32

dataix[1] #选择第2行Out[20]:

a 5b 6c 7d 8e 9Name: two, dtype: int32

data['one':'two'] #当用已知的行索引时为前闭后闭区间,这点与切片稍有不同。Out[22]:

a b c d eone 0 1 2 3 4two 5 6 7 8 9dataix[1:3] #选择第2到4行,不包括第4行,即前闭后开区间。Out[23]:

a b c d etwo 5 6 7 8 9three 10 11 12 13 14dataix[-1:] #取DataFrame中最后一行,返回的是DataFrame类型,注意这种取法是有使用条件的,只有当行索引不是数字索引时才可以使用,否则可以选用`data[-1:]`--返回DataFrame类型或`datairow(-1)`--返回Series类型Out[11]:

a b c d ethree 10 11 12 13 14data[-1:] #跟上面一样,取DataFrame中最后一行,返回的是DataFrame类型Out[12]:

a b c d ethree 10 11 12 13 14dataix[-1] #取DataFrame中最后一行,返回的是Series类型,这个一样,行索引不能是数字时才可以使用Out[13]:

a 10b 11c 12d 13e 14Name: three, dtype: int32

datatail(1) #返回DataFrame中的最后一行datahead(1) #返回DataFrame中的第一行123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186

最近处理数据时发现当pdread_csv()数据时有时候会有读取到未命名的列,且该列也用不到,一般是索引列被换掉后导致的,有强迫症的看着难受,这时候dataframedrop([columns,])是没法处理的,怎么办呢,

最笨的方法是直接给列索引重命名:

data6

Unnamed: 0 high symbol timedate 2016-11-01 0 33174 IF1611 18:10:4482016-11-01 1 33174 IF1611 06:01:0452016-11-01 2 33174 IF1611 07:46:2552016-11-01 3 33184 IF1611 09:30:0402016-11-01 4 33218 IF1611 09:31:040data6columns = list('abcd')

data6 a b c ddate 2016-11-01 0 33174 IF1611 18:10:4482016-11-01 1 33174 IF1611 06:01:0452016-11-01 2 33174 IF1611 07:46:2552016-11-01 3 33184 IF1611 09:30:0402016-11-01 4 33218 IF1611 09:31:04012345678910111213141516171819202122

重新命名后就可以用dataframedrop([columns])来删除了,当然不用我这样全部给列名替换掉了,可以只是改变未命名的那个列,然后删除。不过这个用起来总是觉得有点low,有没有更好的方法呢,有,可以不去删除,直接:

data7 = data6ix[:,1:]1

这样既不改变原有数据,也达到了删除神烦列,当然我这里时第0列删除,可以根据实际选择所在的列删除之,至于这个原理,可以看下前面的对列的 *** 作。

多层次索引Series的索引是MultiIndex结构

根据最外层索引取数时,可直接通过series[outer_index_m]完成

根据内层索引取数时,需要series[:, inner_index_m]完成

更内层索引,series[:, :, , inner_index_m]完成

sreiesunstack()可将双层索引的series转为dataframe,外层索引做行索引,内层索引做列索引

多层次索引的dataframe按最外层行/列索引取数时,返回的结果是一个新的dataframe,所以,可用dataframe的按行/列取数方法依次进行

可以直接指定索引的别名(这是轴的标签,并不是索引本身的名称)

也可以通过MlutiIndex对象复用

dataframestack()方法

            可将多层 列索引 的dataframe转成新的dataframe,将最内层 列 索引转为最内层 行 索引

            若是dataframe只有一层列索引,stack方法会返回一个多层行索引的series

dataframeunstack()方法

            可将多层 行索引 的dataframe转成新的dataframe,将最内层 行 索引转为最 内 层列索引

            若是dataframe只有一层行索引,stack方法会返回一个多层行索引的series

stack方法与unstack方法一直调用都会将dataframe转为series,两种series的区别在于行索引的先后顺序

注:stack/unstack方法可以将dataframe转为series,也可以将series转为dataframe

       在多层次索引pandas对象中,这两个方法可一直调用下去,实现索引重排

上面通过stack/unstack实现了索引重排,一直调用太麻烦,还可以通过swaplevel方法直接指定两个层次的索引对调其位置

首先是引入pandas和numpy,这是经常配合使用的两个包,pandas依赖于numpy,引入以后我们可以直接使用np/pd来表示这个两个模块先创建一个时间索引,所谓的索引(index)就是每一行数据的id,可以标识每一行的唯一值为了快速入门,我们看一下如何创建一个6X4的数据:randn函数用于创建随机数,参数表示行数和列数,dates是上一步创建的索引列我们还可以使用字典来创建数据框,例如创建一个列名为A的数据框,索引是自动创建的整数这又是一个字典创建DataFrame的例子假如字典内的数据长度不同,以最长的数据为准,比如B列有4行:可以使用dtypes来查看各行的数据格式接着看一下如何查看数据框中的数据,看一下所有的数据使用head查看前几行数据(默认是前5行),不过你可以指定前几行查看前三行数据使用tail查看后5行数据查看数据框的索引查看列名用columns查看数据值,用values查看描述性统计,用describe使用type看一下输出的描述性统计是什么样的数据类型——DataFrame数据使用T来转置数据,也就是行列转换对数据进行排序,用到了sort,参数可以指定根据哪一列数据进行排序。

DataFrame对象:二维表数据结构,由行列数据组成的表格

常用index表示行,columns表示列

'''

  语文  数学  英语

0  110  105    99

1  105    88  115

2  109  120  130

'''

# print(dfcolumns)  # Index(['语文', '数学', '英语'], dtype='object')

# print(dfindex)  # Int64Index([0, 1, 2], dtype='int64')

# 遍历DataFrame数据的每一列

'''

0    110

1    105

2    109

Name: 语文, dtype: int64

0    105

1    88

2    120

Name: 数学, dtype: int64

0    99

1    115

2    130

Name: 英语, dtype: int64

'''

1创建一个DataFrame对象

pandasDataFrame(data,index,columns,dtype,copy)

# data表示数据,可以是ndarray数组,series对象、列表、字典等

# index表示行标签(索引)

# columns表示列标签(索引)

# dtype每一列数据的数据类型

# copy用于复制数据

# 返回值DataFrame

通过二维数组创建成绩表

'''

  语文  数学  英语

0  110  105    99

1  105    88  115

2  109  120  130

'''

2通过字典创建DataFrame对象

value值只能是一维数组或单个的简单数据类型

# 数组,则要求所有的数组长度一致

# 单个数据,每行都需要添加相同数据

'''

  语文  数学  英语    班级

0  110  105  109  高一7班

1  105    88  120  高一7班

2    99  115  130  高一7班

'''

'''

DataFrame属性

values 查看所有元素的值  dfvalues

dtypes 查看所有元素的类型  dfdtypes

index 查看所有行名、重命名行名  dfindex    dfindex=[1,2,3]

columns 查看所有列名、重命名列名  dfcolumns  dfcolumns=['语','数']

T 行列数据转换  dfT

head 查看前n条数据,默认5条                dfhead()  dfhead(10)

tail 查看后n条数据,默认5条                dftail()  dftail(10)

shape 查看行数和列数,[0]表示行,[1]表示列    dfshape[0]  dfshape[1]

info 查看索引,数据类型和内存信息    dfinfo

DataFrame函数

describe 查看每列的统计汇总信息,DataFrame类型  dfdescribe()

count    返回每一列中的非空值的个数              dfcount()

sum      返回每一列和和,无法计算返回空值      dfsum()

max      返回每一列的最大值                dfmax()

min      返回每一列的最小值                dfmin()

argmax  返回最大值所在的自动索引位置        dfargmax()

argmin  返回最小值所在的自动索引位置        dfargmin()

idxmax  返回最大值所在的自定义索引位置      dfidxmax()

idxmin  返回最小值所在的自定义索引位置      dfidxmin()

mean    返回每一列的平均值                dfmean()

median  返回每一列的中位数                dfmedian()

var      返回每一列的方差                  dfvar()

std      返回每一列的标准差  dfstd()

isnull  检查df中的空值,空值为True,否则为False,返回布尔型数组  dfisnull()

notnull  检查df中的空值,非空值为True,否则为False,返回布尔型数组  dfnotnull()

中位数又称中值,是指按顺序排列的一组数据中居于中间位置的数

方差用于度量单个随机变量的离散程序(不连续程度)

标准差是方差的算术平方根,反映数据集的离散程度

'''

3 导入xls或xlsx文件

# pandasread_excel(io,sheetname=0,header=0,names=None,index_col=None,usecols=None,squeeze=False,dtype=None,engine=None,converters=None,true_values=None,false_values=None,skiprows=None,nrow=None,na_values=None,keep_defalut_na=True,verbose=False,parse_dates=False,date_parser=None,thousands=None,comment=None,skipfooter=0,conver_float=True,mangle_dupe_cols=True,kwds)

'''

io 字符串,xls或xlsx文件路径或类文件对象

sheet_name:None、字符串、整数、字符串列表或整数列表,默认值为0

    字符串用于工作表名称;整数为索引,表示工作表位置

    字符串列表或整数列表用于请求多个工作表,为None时则获取所有的工作表

    sheet_name = 0 第一个Sheet页中的数据作为DataFrame对象

    sheet_name = 1 第二个Sheet页中的数据作为DataFrame对象

    sheet_name = 'Sheet1' 名为Sheet1的Sheet页中的数据作为DataFrame对象

    sheet_name = [0,1,'Sheet3'] 第一个,第二个和名为Sheet3的Sheet页中的数据作为DataFrame对象

header:指定作为列名的行,默认值为0,即取第一行的值为列名。或数据不包含列名,则为header=None

names:默认值为None,要使用的列名列表

index_col:指定列为索引列,默认值为None,索引0是DataFrame对象的行标签

usecols:int、list或字符串,默认值为None

    如为None,则解析所有列

    如为int,则解析最后一列

    如为list列表,则解析列号和列表的列

    如为字符串,则表示以逗号分隔的Excel列字母和列范围列表

squeeze:布尔值,默认为False,如果解析的数据只包含一列,则返回一个Series

dtype:列的数据类型名称为字典,默认值为None

skiprows:省略指定行数的数据,从第一行开始

skipfooter:省略指定行数的数据,从尾部数的行开始

4导入指定Sheet页的数据

# sheet_name=0表示第一个sheet页的数据,以此类推,如果不指定,则导入第一页

5指定行索引导入Excel数据

'''

Empty DataFrame

Columns: []

Index: [1, 3, 5]

'''

# 导入第一列数据

'''

Empty DataFrame

Columns: []

Index: [1, 3, 5]

'''

以上就是关于Python—padas(DataFrame)的常用 *** 作全部的内容,包括:Python—padas(DataFrame)的常用 *** 作、Series第三讲 索引、迭代、Python的pandas 数组如何得到索引值,如图,我要得到ohio 的索引值,应该怎样做等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9685376.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存