pandas学习-第三章(分组)

import numpy as np
import pandas as pd 
df=pd.read_csv('E:\jupyter Notebook\天池比赛\pandas学习\joyful-pandas-master\data\\table.csv',index_col='ID')
df=df.drop(columns='Unnamed: 0')
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 35 entries, 1101 to 2405
Data columns (total 8 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   School   35 non-null     object 
 1   Class    35 non-null     object 
 2   Gender   35 non-null     object 
 3   Address  35 non-null     object 
 4   Height   35 non-null     int64  
 5   Weight   35 non-null     int64  
 6   Math     35 non-null     float64
 7   Physics  35 non-null     object 
dtypes: float64(1), int64(2), object(5)
memory usage: 2.5+ KB

SAC过程

  1. 内涵
  • SAC指的是分组操作中的split-apply-combine过程
  • 其中split指基于某一些规则,将数据拆成若干组,apply是指对每一组独立地使用函数,combine指将每一组的结果组合成某一类数据结构
  1. apply过程
  • 在该过程中,我们实际往往会遇到四类问题:
  • 整合(Aggregation)——即分组计算统计量(如求均值、求每组元素个数)
  • 变换(Transformation)——即分组对每个单元的数据进行操作(如元素标准化)
  • 过滤(Filtration)——即按照某些规则筛选出一些组(如选出组内某一指标小于50的组)
  • 综合问题——即前面提及的三种问题的混合

group函数

分组函数的基本内容

根据某一列分组

grouped_single=df.groupby('School')
#经过分组函数后,生成一个groupby对象,不会返回任何东西。只有当调用的时候才起作用
grouped_single
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002277196F748>
  • 例如取出某一组
grouped_single.get_group('S_1').head()
SchoolClassGenderAddressHeightWeightMathPhysics
ID
1101S_1C_1Mstreet_11736334.0A+
1102S_1C_1Fstreet_21927332.5B+
1103S_1C_1Mstreet_21868287.2B+
1104S_1C_1Fstreet_21678180.4B-
1105S_1C_1Fstreet_41596484.8B+

根据某几列分组

grouped_mul=df.groupby(['School','Class'])
grouped_mul.get_group(('S_2','C_4'))
SchoolClassGenderAddressHeightWeightMathPhysics
ID
2401S_2C_4Fstreet_21926245.3A
2402S_2C_4Mstreet_71668248.7B
2403S_2C_4Fstreet_61586059.7B+
2404S_2C_4Fstreet_21608467.7B
2405S_2C_4Fstreet_61935447.6B

组容量与组数

grouped_single.size()
School
S_1    15
S_2    20
dtype: int64
grouped_mul.size()
School  Class
S_1     C_1      5
        C_2      5
        C_3      5
S_2     C_1      5
        C_2      5
        C_3      5
        C_4      5
dtype: int64
grouped_single.ngroups
2
grouped_mul.ngroups
7

组的遍历

for name,group in grouped_single:
    print(name)
    display(group.head())
S_1
SchoolClassGenderAddressHeightWeightMathPhysics
ID
1101S_1C_1Mstreet_11736334.0A+
1102S_1C_1Fstreet_21927332.5B+
1103S_1C_1Mstreet_21868287.2B+
1104S_1C_1Fstreet_21678180.4B-
1105S_1C_1Fstreet_41596484.8B+
S_2
SchoolClassGenderAddressHeightWeightMathPhysics
ID
2101S_2C_1Mstreet_71748483.3C
2102S_2C_1Fstreet_61616150.6B+
2103S_2C_1Mstreet_41576152.5B-
2104S_2C_1Fstreet_51599772.2B+
2105S_2C_1Mstreet_41708134.2A

level参数(用于多级索引)和axis参数

df.set_index(['Gender','School','Class']).groupby(level=1,axis=0).get_group('S_1').head()
AddressHeightWeightMathPhysics
GenderSchoolClass
MS_1C_1street_11736334.0A+
FS_1C_1street_21927332.5B+
MS_1C_1street_21868287.2B+
FS_1C_1street_21678180.4B-
C_1street_41596484.8B+

groupby对象的特点

查看所有可调用的方法

print([attr for attr in dir(grouped_single) if not attr.startswith('_')])
['Address', 'Class', 'Gender', 'Height', 'Math', 'Physics', 'School', 'Weight', 'agg', 'aggregate', 'all', 'any', 'apply', 'backfill', 'bfill', 'boxplot', 'corr', 'corrwith', 'count', 'cov', 'cumcount', 'cummax', 'cummin', 'cumprod', 'cumsum', 'describe', 'diff', 'dtypes', 'expanding', 'ffill', 'fillna', 'filter', 'first', 'get_group', 'groups', 'head', 'hist', 'idxmax', 'idxmin', 'indices', 'last', 'mad', 'max', 'mean', 'median', 'min', 'ndim', 'ngroup', 'ngroups', 'nth', 'nunique', 'ohlc', 'pad', 'pct_change', 'pipe', 'plot', 'prod', 'quantile', 'rank', 'resample', 'rolling', 'sem', 'shift', 'size', 'skew', 'std', 'sum', 'tail', 'take', 'transform', 'tshift', 'var']

分组对象的head和first

  • 对分组对象使用head函数,返回的是每组的前几行,而不是数据集的前几行
grouped_single.head(3)
SchoolClassGenderAddressHeightWeightMathPhysics
ID
1101S_1C_1Mstreet_11736334.0A+
1102S_1C_1Fstreet_21927332.5B+
1103S_1C_1Mstreet_21868287.2B+
2101S_2C_1Mstreet_71748483.3C
2102S_2C_1Fstreet_61616150.6B+
2103S_2C_1Mstreet_41576152.5B-
  • first显示的是以分组为索引的每组的第一个分组信息
grouped_single.first()
ClassGenderAddressHeightWeightMathPhysics
School
S_1C_1Mstreet_11736334.0A+
S_2C_1Mstreet_71748483.3C

分组依据

  • 对于groupby函数而言,分组的依据比较自由,只要是与数据框长度相同的列表即可,同时支持函数型分组
df.groupby(np.random.choice(['a','b','c'],df.shape[0])).get_group('a').head(20)
SchoolClassGenderAddressHeightWeightMathPhysics
ID
1101S_1C_1Mstreet_11736334.0A+
1102S_1C_1Fstreet_21927332.5B+
1104S_1C_1Fstreet_21678180.4B-
1203S_1C_2Mstreet_61605358.8A+
1204S_1C_2Fstreet_51626333.8B
1205S_1C_2Fstreet_61676368.4B-
1301S_1C_3Mstreet_41616831.5B+
1303S_1C_3Mstreet_71888249.7B
2101S_2C_1Mstreet_71748483.3C
2104S_2C_1Fstreet_51599772.2B+
2105S_2C_1Mstreet_41708134.2A
2201S_2C_2Mstreet_519310039.1B
2204S_2C_2Mstreet_11757447.2B-
2301S_2C_3Fstreet_41577872.3B+
2303S_2C_3Fstreet_71909965.9C
2402S_2C_4Mstreet_71668248.7B
2403S_2C_4Fstreet_61586059.7B+
  • 从原理上说,利用函数的时候,传入的对象就是索引,因此根据这一特性可以做一些复杂的操作
df[:5].groupby(lambda x:print(x)).head(0)
1101
1102
1103
1104
1105
SchoolClassGenderAddressHeightWeightMathPhysics
ID
  • 根据奇偶行分组
df.groupby(lambda x:'奇数行' if  df.index.get_loc(x)%2!=1 else '偶数行').groups
{'偶数行': Int64Index([1102, 1104, 1201, 1203, 1205, 1302, 1304, 2101, 2103, 2105, 2202,
             2204, 2301, 2303, 2305, 2402, 2404],
            dtype='int64', name='ID'),
 '奇数行': Int64Index([1101, 1103, 1105, 1202, 1204, 1301, 1303, 1305, 2102, 2104, 2201,
             2203, 2205, 2302, 2304, 2401, 2403, 2405],
            dtype='int64', name='ID')}
  • 如果是多层索引,那么lambda表达式中的输入就是元组,下面实现的功能为查看两所学校中男女学生的均分是及格
  • 此处只是演示groupby的用法,实际操作不会这样写
math_sorce=df.set_index(['Gender','School'])['Math'].sort_index()
math_sorce
Gender  School
F       S_1       32.5
        S_1       80.4
        S_1       84.8
        S_1       63.5
        S_1       33.8
        S_1       68.4
        S_1       87.7
        S_1       61.7
        S_2       50.6
        S_2       72.2
        S_2       68.5
        S_2       85.4
        S_2       72.3
        S_2       65.9
        S_2       95.5
        S_2       45.3
        S_2       59.7
        S_2       67.7
        S_2       47.6
M       S_1       34.0
        S_1       87.2
        S_1       97.0
        S_1       58.8
        S_1       31.5
        S_1       49.7
        S_1       85.2
        S_2       83.3
        S_2       52.5
        S_2       34.2
        S_2       39.1
        S_2       73.8
        S_2       47.2
        S_2       32.7
        S_2       48.9
        S_2       48.7
Name: Math, dtype: float64
grouped_sorce=df.set_index(['Gender','School']).sort_index().groupby(lambda x:(x,'均分及格' if math_sorce[x].mean()>=60 else '均分不及格'))
for name, _ in grouped_sorce:print(name)
(('F', 'S_1'), '均分及格')
(('F', 'S_2'), '均分及格')
(('M', 'S_1'), '均分及格')
(('M', 'S_2'), '均分不及格')

groupby和[]操作

df.groupby(['Gender','School'])['Math'].mean()>=60
Gender  School
F       S_1        True
        S_2        True
M       S_1        True
        S_2       False
Name: Math, dtype: bool
  • 用列表可选出多个属性
df.groupby(['Gender','School'])[['Math','Height']].mean()
MathHeight
GenderSchool
FS_164.100000173.125000
S_266.427273173.727273
MS_163.342857178.714286
S_251.155556172.000000

连续型变量分组

  • 利用cut函数对数学成绩分组
bins=[0,40,60,80,90,100]
cuts=pd.cut(df['Math'],bins=bins)
df.groupby(cuts)['Math'].count()
#区间分组
Math
(0, 40]       7
(40, 60]     10
(60, 80]      9
(80, 90]      7
(90, 100]     2
Name: Math, dtype: int64

聚合、过滤和变换

聚合(Aggregation)

常用的聚合函数

  • 所谓聚合就是把一堆数,变成一个标量,因此mean/sum/size/count/std/var/sem/describe/first/last/nth/min/max都是聚合函数
  • 为了熟悉操作,不妨验证标准误sem函数,它的计算公式是: 组 内 标 准 差 组 容 量 \frac{组内标准差}{\sqrt{组容量}} ,下面进行验证:
group_m=grouped_single['Math']
group_m.std().values/np.sqrt(group_m.count().values)==group_m.sem().values
array([ True,  True])
group_m.std().values/np.sqrt(group_m.count().values)
array([5.95857818, 3.93308821])
group_m.sem().values
array([5.95857818, 3.93308821])
group_m.std().values
array([23.07747407, 17.58930521])

同时使用多个聚合函数

group_m.agg(['sum','mean','std'])#这些直接就可以表示函数了
summeanstd
School
S_1956.263.74666723.077474
S_21191.159.55500017.589305

指定哪些列使用哪些函数

grouped_mul.agg({'Math':{'mean','max'},'Height':'var'})
MathHeight
maxmeanvar
SchoolClass
S_1C_187.263.78183.3
C_297.064.30132.8
C_387.763.16179.2
S_2C_183.358.5654.7
C_285.462.80256.0
C_395.563.06205.7
C_467.753.80300.2

使用自定义函数

grouped_single['Math'].agg(lambda x:print(x.head(),'间隔'))
#agg函数式分组逐列进行的
1101    34.0
1102    32.5
1103    87.2
1104    80.4
1105    84.8
Name: Math, dtype: float64 间隔
2101    83.3
2102    50.6
2103    52.5
2104    72.2
2105    34.2
Name: Math, dtype: float64 间隔





School
S_1    None
S_2    None
Name: Math, dtype: object
  • 极差函数
grouped_single['Math'].agg(lambda x:x.max()-x.min())
School
S_1    65.5
S_2    62.8
Name: Math, dtype: float64

利用NameAgg函数进行多个聚合

  • 注意:不支持lambda函数,只能通过def函数实现
def R1(x):
    return x.max()-x.min()
def R2(x):
    return x.max()-x.median()
grouped_single['Math'].head()
ID
1101    34.0
1102    32.5
1103    87.2
1104    80.4
1105    84.8
2101    83.3
2102    50.6
2103    52.5
2104    72.2
2105    34.2
Name: Math, dtype: float64
grouped_single['Math'].agg(min_score1=pd.NamedAgg(column='col1',aggfunc=R1),
                           max_score2=pd.NamedAgg(column='col2',aggfunc='max'),
                           range_score2=pd.NamedAgg(column='col3',aggfunc=R2))
#column可以直接建立新的,后面再确定使用的聚合函数
min_score1max_score2range_score2
School
S_165.597.033.5
S_262.895.539.4

带参数的聚合函数

1. 判断是否组内数学分数至少有一个值在50-52之间

def f(s,high,low):
    return s.between(high,low).max()
grouped_single['Math'].agg(f,52,50)
School
S_1    False
S_2    False
Name: Math, dtype: bool

2. 如果需要使用多个函数,并且其中至少有一个带参数,则使用wrap技巧:

def f_test(s,high,low):
    return s.between(high,low).max()
def agg_f(f_mul,name,*args,**kwargs):
    def wrapper(x):
        return f_mul(x,*args,**kwargs)
    wrapper._name_=name
    return wrapper
new_f=agg_f(f_test,'at_least_one_in_50-52',52,50)
grouped_single['Math'].agg([new_f,'mean']).head()
wrappermean
School
S_1False63.746667
S_2False59.555000

过滤

- filter函数是用来筛选某些组的(结果是全体组),因此传入的值是布尔标量

grouped_single[['Math','Physics']].filter(lambda x:(x['Math']>32).all())
MathPhysics
ID
210183.3C
210250.6B+
210352.5B-
210472.2B+
210534.2A
220139.1B
220268.5B+
220373.8A+
220447.2B-
220585.4B
230172.3B+
230232.7A
230365.9C
230495.5A-
230548.9B
240145.3A
240248.7B
240359.7B+
240467.7B
240547.6B

变换

传入对象

  • transform函数中传入的对象是组内的列,并且返回值需要与列长完全一致
grouped_single[['Math','Height']].transform(lambda x:x-x.min())
MathHeight
ID
11012.514
11021.033
110355.727
110448.98
110553.30
120165.529
120232.017
120327.31
12042.33
120536.98
13010.02
130256.216
130318.229
130453.736
130530.228
210150.619
210217.96
210319.82
210439.54
21051.515
22016.438
220235.839
220341.10
220414.520
220552.728
230139.62
23020.016
230333.235
230462.89
230516.232
240112.637
240216.011
240327.03
240435.05
240514.938
  • 如果返回了标量值,那么组内的所有元素会被广播这个值
grouped_single[['Math','Height']].transform(lambda x:x.mean())
#single这个df是按school进行分组,所以两个不同的学校,均值不同
MathHeight
ID
110163.746667175.733333
110263.746667175.733333
110363.746667175.733333
110463.746667175.733333
110563.746667175.733333
120163.746667175.733333
120263.746667175.733333
120363.746667175.733333
120463.746667175.733333
120563.746667175.733333
130163.746667175.733333
130263.746667175.733333
130363.746667175.733333
130463.746667175.733333
130563.746667175.733333
210159.555000172.950000
210259.555000172.950000
210359.555000172.950000
210459.555000172.950000
210559.555000172.950000
220159.555000172.950000
220259.555000172.950000
220359.555000172.950000
220459.555000172.950000
220559.555000172.950000
230159.555000172.950000
230259.555000172.950000
230359.555000172.950000
230459.555000172.950000
230559.555000172.950000
240159.555000172.950000
240259.555000172.950000
240359.555000172.950000
240459.555000172.950000
240559.555000172.950000
grouped_single.head()
SchoolClassGenderAddressHeightWeightMathPhysics
ID
1101S_1C_1Mstreet_11736334.0A+
1102S_1C_1Fstreet_21927332.5B+
1103S_1C_1Mstreet_21868287.2B+
1104S_1C_1Fstreet_21678180.4B-
1105S_1C_1Fstreet_41596484.8B+
2101S_2C_1Mstreet_71748483.3C
2102S_2C_1Fstreet_61616150.6B+
2103S_2C_1Mstreet_41576152.5B-
2104S_2C_1Fstreet_51599772.2B+
2105S_2C_1Mstreet_41708134.2A

利用变换方法进行组内标准化

grouped_single[['Math','Height']].transform(lambda x:(x-x.mean())/x.std())
MathHeight
ID
1101-1.288991-0.214991
1102-1.3539901.279460
11031.0162870.807528
11040.721627-0.686923
11050.912289-1.316166
12011.4409430.964839
1202-0.0106890.020975
1203-0.214350-1.237510
1204-1.297658-1.080200
12050.201640-0.686923
1301-1.397322-1.158855
13021.037953-0.057681
1303-0.6086740.964839
13040.9296221.515426
1305-0.0886870.886183
21011.3499680.073242
2102-0.509116-0.833560
2103-0.401096-1.112576
21040.718903-0.973068
2105-1.441501-0.205774
2201-1.1629231.398568
22020.5085481.468322
22030.809867-1.252084
2204-0.7024150.142996
22051.4693590.701028
23010.724588-1.112576
2302-1.526780-0.136020
23030.3607311.189306
23042.043571-0.624298
2305-0.6057660.980044
2401-0.8104361.328814
2402-0.617136-0.484790
24030.008244-1.042822
24040.463065-0.903314
2405-0.6796741.398568

利用变换方法进行组内缺失值的均值补充

df_nan = df[['Math', 'School']].copy().reset_index()
df_nan.loc[np.random.randint(0, df.shape[0], 25), ['Math']] = np.nan
df_nan#随机函数缺失值
IDMathSchool
01101NaNS_1
11102NaNS_1
21103NaNS_1
31104NaNS_1
41105NaNS_1
51201NaNS_1
61202NaNS_1
7120358.8S_1
8120433.8S_1
91205NaNS_1
10130131.5S_1
111302NaNS_1
12130349.7S_1
13130485.2S_1
14130561.7S_1
152101NaNS_2
162102NaNS_2
17210352.5S_2
182104NaNS_2
192105NaNS_2
20220139.1S_2
21220268.5S_2
222203NaNS_2
23220447.2S_2
24220585.4S_2
25230172.3S_2
262302NaNS_2
27230365.9S_2
28230495.5S_2
292305NaNS_2
302401NaNS_2
312402NaNS_2
32240359.7S_2
33240467.7S_2
342405NaNS_2
df_nan.groupby('School').transform(lambda x:x.fillna(x.mean())).join(df.reset_index()['School'])
IDMathSchool
0110153.45S_1
1110253.45S_1
2110353.45S_1
3110453.45S_1
4110553.45S_1
5120153.45S_1
6120253.45S_1
7120358.80S_1
8120433.80S_1
9120553.45S_1
10130131.50S_1
11130253.45S_1
12130349.70S_1
13130485.20S_1
14130561.70S_1
15210165.38S_2
16210265.38S_2
17210352.50S_2
18210465.38S_2
19210565.38S_2
20220139.10S_2
21220268.50S_2
22220365.38S_2
23220447.20S_2
24220585.40S_2
25230172.30S_2
26230265.38S_2
27230365.90S_2
28230495.50S_2
29230565.38S_2
30240165.38S_2
31240265.38S_2
32240359.70S_2
33240467.70S_2
34240565.38S_2

apply函数

apply函数的灵活性

  • 对于传入值而言,从下面的打印内容可以看到是以分组的表传入apply中:
df.groupby('School').apply(lambda x:print(x.head()))
     School Class Gender   Address  Height  Weight  Math Physics
ID                                                              
1101    S_1   C_1      M  street_1     173      63  34.0      A+
1102    S_1   C_1      F  street_2     192      73  32.5      B+
1103    S_1   C_1      M  street_2     186      82  87.2      B+
1104    S_1   C_1      F  street_2     167      81  80.4      B-
1105    S_1   C_1      F  street_4     159      64  84.8      B+
     School Class Gender   Address  Height  Weight  Math Physics
ID                                                              
2101    S_2   C_1      M  street_7     174      84  83.3       C
2102    S_2   C_1      F  street_6     161      61  50.6      B+
2103    S_2   C_1      M  street_4     157      61  52.5      B-
2104    S_2   C_1      F  street_5     159      97  72.2      B+
2105    S_2   C_1      M  street_4     170      81  34.2       A
  • apply函数的返回值具有多样性
    1.返回标量值
df[['School','Math','Height']].groupby('School').apply(lambda x:x.max())
SchoolMathHeight
School
S_1S_197.0195
S_2S_295.5194
  1. 列表返回值
df[['School','Math','Height']].groupby('School').apply(lambda x:x-x.max())
MathHeight
ID
1101-63.0-22.0
1102-64.5-3.0
1103-9.8-9.0
1104-16.6-28.0
1105-12.2-36.0
12010.0-7.0
1202-33.5-19.0
1203-38.2-35.0
1204-63.2-33.0
1205-28.6-28.0
1301-65.5-34.0
1302-9.3-20.0
1303-47.3-7.0
1304-11.80.0
1305-35.3-8.0
2101-12.2-20.0
2102-44.9-33.0
2103-43.0-37.0
2104-23.3-35.0
2105-61.3-24.0
2201-56.4-1.0
2202-27.00.0
2203-21.7-39.0
2204-48.3-19.0
2205-10.1-11.0
2301-23.2-37.0
2302-62.8-23.0
2303-29.6-4.0
23040.0-30.0
2305-46.6-7.0
2401-50.2-2.0
2402-46.8-28.0
2403-35.8-36.0
2404-27.8-34.0
2405-47.9-1.0
  1. DataFrame返回值
df[['School','Math','Height']].groupby('School').apply(lambda x:pd.DataFrame({'col1':x['Math']-x['Math'].max(),'col2':x['Math']-x['Math'].min()}))
col1col2
ID
1101-63.02.5
1102-64.51.0
1103-9.855.7
1104-16.648.9
1105-12.253.3
12010.065.5
1202-33.532.0
1203-38.227.3
1204-63.22.3
1205-28.636.9
1301-65.50.0
1302-9.356.2
1303-47.318.2
1304-11.853.7
1305-35.330.2
2101-12.250.6
2102-44.917.9
2103-43.019.8
2104-23.339.5
2105-61.31.5
2201-56.46.4
2202-27.035.8
2203-21.741.1
2204-48.314.5
2205-10.152.7
2301-23.239.6
2302-62.80.0
2303-29.633.2
23040.062.8
2305-46.616.2
2401-50.212.6
2402-46.816.0
2403-35.827.0
2404-27.835.0
2405-47.914.9

用apply同时统计多个指标

  • 借助orderdict工具进行快捷统计
from collections import OrderedDict
def f(df):
    data=OrderedDict()
    data['M_sum']=df['Math'].sum()
    data['W_var']=df['Weight'].var()
    data['H_mean']=df['Height'].mean()
    return pd.Series(data)
grouped_single.apply(f).head()
M_sumW_varH_mean
School
S_1956.2117.428571175.733333
S_21191.1181.081579172.950000

问题与练习

问题

什么是fillna的前向/后向填充,如何实现?

使用靠近缺失值的数值进行填充(前一个、后一个) bfill,ffill

下面的代码实现了什么功能?请仿照设计一个它的groupby版本。

#首先求出累计和
# 再进行差分操作(diff函数)
s = pd.Series ([0, 1, 1, 0, 1, 1, 1, 0])
s1 = s.cumsum()#加上之前的一个值
result = s.mul(s1).diff().where(lambda x: x < 0).ffill().add(s1,fill_value =0)
result
  File "<ipython-input-169-c345ec6719c0>", line 2
    s1 = s.cumsum()?
                   ^
SyntaxError: invalid syntax
s = pd.Series ([0, 1, 1, 0, 1, 1, 1, 0])
s1 = s.cumsum()
result=
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值