EXCEL | 如何将多行重复的数据合并(或多行求均值合并)

任务场景: 在采集数据时,有些时候可能会对同一个样本进行多次采样,就导致该样本的某个指标值对应多个采样值(每次采样值都会有些许偏差),所以快速将多个采样值求均值合并为一行数据是很重要的操作。如果是列求值,就将下列函数中的行列调换就行了

EXCEL公式:

例如从A1开始,每三行求一次平均值并合并

=AVERAGE(OFFSET($A$1,(ROW()-1)*3,0,3,1))

(1) OFFSET(reference, rows, cols, [height], [width])  : 返回基于指定单元格或区域的偏移量的单元格或区域

  • reference(必需):作为起点的引用单元格或单元格范围。你希望从哪里开始偏移。
  • rows(必需):从 reference 处出发,向上或向下偏移的行数。正数表示向下偏移,负数表示向上偏移。 

        对于公式中的 (ROW()-1)*3  :   

        因为我们是要每三行数据求一次平均值,所以对于接收新值的单元格,每变化一个单位相当于原数据中的三行,如果要对N行求值,就  *N 表示下一次返回的值从N行后返回

        而 ROW-1 则是表示接收数据的起始位置,如果是从第N行接收数据,那公式就是  ROW - N

        如果还是不太理解,可以输入这个公式后,利用EXCEL自带的公式求值功能清晰地观看每一步地计算步骤。如果 (ROW()-1)*3 的值为 n 那最终返回的行数就是  【 reference + n  ,reference + n + height 】

  • cols(必需):向左或向右偏移的列数。正数表示向右,负数表示向左。
  • height(可选):返回行数的个数。默认为 1 行。
  • width(可选):返回列数的个数。默认为 1 列。 

(2) AVERAGE( )  :  对返回的数据求均值

需要注意的是,上述的公式在处理数据时有一个弊端,即该公式只能一列一列的处理数据,对于大量数据需要处理的任务还是很麻烦。

=AVERAGE(OFFSET( A$1,(ROW()-1)*3,0,3,1))

         解决的办法也很简单,因为上一个公式在选定起始位置时把列也固定了,所以只需删掉列前面的 $ 符号,然后输入公式后选中单元格直接往左拉,列数就会自动加了,也就实现了对多列数据同时操作。

最后,如果还需要规定最终求得值的小数点精确度,可以再加上 ROUND ( )   函数

=ROUND(AVERAGE(OFFSET( A$1,(ROW()-2)*3,0,3,1)), 2)

<think>好的,我现在要解决的问题是使用Python的pandas库来计算多个CSV文件中B34到AJ71范围内相邻两列的均值差异,并将结果保存到新的CSV文件中。我需要仔细思考整个流程,确保每一步都正确。 首先,我需要明确用户的需。用户提到的“B34:AJ71”范围,这通常指的是Excel中的单元格范围,但在CSV文件中并不存在单元格的概念。不过,CSV文件是纯文本的,按行和列存储数据,所以这里的B34到AJ71应该对应的是数据的行和列索引。可能B代表第二列,AJ则是第36列(因为A是第1列,B是第2,依此类推,AJ是A(26)+J(10)=36)。行号34到71,即从第34行到第71行。但需要注意,CSV文件通常没有列名,者可能有不同的列名,所以可能需要调整索引方式。者用户可能希望跳过前33行,读取到第34行到第71行,然后选择列的范围从B(第二列)到AJ(第36列)。这需要确认列的位置是否正确。 接下来,我需要确定如何用pandas读取这些CSV文件。pandas的read_csv函数可以指定读取的行范围和列范围。对于行范围,可以使用skiprows和nrows参数。例如,要读取从第34行到第71行,假设文件有标题行的话,可能需要调整。但通常,如果CSV没有标题,者用户希望包括标题,可能需要不同的处理。这里可能需要用户明确是否有标题行,但根据问题描述,可能假设没有标题行,者用户希望直接按位置处理。例如,使用skiprows=33来跳过前33行(因为行号从0开始,第34行是索引33),然后读取nrows=71-34+1=38行?者可能用户指的是Excel中的行号34到71,对应CSV中的行号33到70(如果CSV从0开始计数的话)。这里可能需要进一步确认,但暂时假设用户希望读取从第34行到第71行的数据,即使用skiprows=33(跳过前33行)和nrows=38(共38行:71-34+1=38)。 关于列的范围,B到AJ列对应的列索引。B是第2列(索引1,因为pandas从0开始),AJ列是第36列(索引35)。所以需要读取列的范围是1到35。在read_csv中,可以使用usecols参数来指定列的范围,但需要明确列的索引。例如,usecols=range(1,36)来选择列索引1到35,对应B到AJ列。 然后,对于每个CSV文件,需要处理这些范围内的数据,计算相邻两列的均值差。例如,列B和列C的均值差,列C和列D的均值差,直到列AI和列AJ的均值差。总共有35-1=34个相邻列对。每个对的均值差是两列的平均值之差。 计算均值差的方法是:对每一对相邻列,计算它们的平均值,然后取差值。例如,对于列i和列i+1,计算mean(列i) - mean(列i+1)者绝对值?用户没有说明是否需要绝对值,但根据问题描述,可能直接计算差值即可。结果应该是一个序列,每个差值对应一对相邻列。 处理多个CSV文件,每个文件处理后的结果可能需要保存到一个新的CSV文件中,者将所有结果合并到一个文件中。用户提到“将结果保存到新的CSV文件”,所以可能需要每个输入文件对应一个输出文件,者将所有结果合并。假设每个输入文件生成一个输出文件,其中包含该文件的相邻列均值差。 保存结果时,输出文件的结构可能是一行,每个元素对应一个相邻列的均值差,多行?可能每个文件的结果是一个包含多个均值差的行,列名为对应的列对,如B-C, C-D等。者,可能需要保存为一列,每个行代表一个列对的差值。需要明确输出结构。但根据问题描述,可能每个文件的处理结果是一行,包含所有相邻列的均值差,然后将所有文件的结果合并到一个CSV中,者每个文件单独保存。但用户提到“多个CSV文件”,所以可能需要遍历每个文件,处理并保存结果到一个新的CSV文件中,可能每个结果文件对应一个输入文件,者将所有结果合并到一个文件中。需要进一步明确,但可能用户希望将所有结果合并到一个文件中,每行对应一个输入文件的均值差序列。 现在,整合这些步骤: 1. 遍历指定目录下的所有CSV文件。 2. 对于每个CSV文件: a. 读取B34:AJ71范围的数据,即跳过前33行,读取接下来的38行,并选择列索引1到35。 b. 计算相邻列的均值差,得到一系列数值。 c. 将这些数值保存到新CSV文件中,可能作为一行,列名为列对名称。 3. 合并所有文件的结果到同一个输出文件,者每个输入文件生成一个输出文件。 但用户可能希望将所有处理后的结果保存到一个新的CSV文件中,每行代表一个输入文件的处理结果。 现在,考虑代码实现: 使用pandas的read_csv时,参数设置可能如下: df = pd.read_csv(file_path, skiprows=33, nrows=38, usecols=range(1,36), header=None) 这里假设没有标题行,因此header=None。然后,数据框df将包含从B34到AJ71的数据。 接下来,计算相邻列的均值差: differences = [] for i in range(df.shape[1] - 1): col1 = df.iloc[:, i] col2 = df.iloc[:, i+1] diff = col1.mean() - col2.mean() differences.append(diff) 这将遍历每一对相邻列,计算均值差并存储在列表中。 然后将这个列表保存到新的CSV文件中。可能需要将每个文件的differences列表作为一行追加到结果文件中。 例如,将所有结果收集到一个DataFrame中,每个文件对应一行,列名为列对: columns = [f"Col{i+1}-Col{i+2}" for i in range(len(differences))] result_df = pd.DataFrame([differences], columns=columns) 然后保存到CSV: result_df.to_csv("output.csv", index=False, mode='a' if not first_file else 'w') 但需要注意,当处理多个文件时,可能需要将每个结果追加到同一个CSV文件中,者每个文件生成独立的输出。这里需要根据用户需调整。例如,用户可能希望每个输入文件生成一个输出文件,其中包含该文件的均值差,者将所有结果合并到一个输出文件中。 可能用户希望每个输入文件生成一个输出文件,例如,原文件名为data1.csv,则输出为data1_result.csv,其中包含该文件的相邻列均值差。者将所有结果合并到一个文件中,每行对应一个输入文件的差异。 但问题描述中用户提到“将结果保存到新的CSV文件”,可能是指生成一个总的结果文件,包含所有输入文件的处理结果。因此,在处理每个文件时,将其差异作为一行添加到结果DataFrame中,最后保存到CSV。 现在,整合代码的大致步骤: 1. 导入必要的库:pandas, glob等。 2. 定义输入文件路径的模式,例如所有CSV文件在某个文件夹下。 3. 初始化一个空的DataFrame来收集结果。 4. 遍历每个CSV文件: a. 读取指定范围的数据。 b. 计算相邻列均值差。 c. 将结果添加到结果DataFrame中。 5. 将结果DataFrame保存到新的CSV文件。 但需要注意异常处理,例如某些文件可能行数不足,者列数不足,导致读取失败。需要添加try-except块来跳过错误文件,者报错。 现在,编写示例代码: import pandas as pd import glob # 获取所有CSV文件路径 csv_files = glob.glob('path/to/csv/files/*.csv') # 存储所有结果 all_differences = [] for file in csv_files: try: # 读取CSV文件,跳过前33行,读取38行,列1到35(B到AJ) df = pd.read_csv(file, skiprows=33, nrows=38, usecols=range(1,36), header=None) # 计算相邻列均值差 differences = [] for i in range(df.shape[1] - 1): mean1 = df.iloc[:, i].mean() mean2 = df.iloc[:, i+1].mean() differences.append(mean1 - mean2) # 添加到结果列表 all_differences.append(differences) except Exception as e: print(f"处理文件{file}时出错: {e}") continue # 创建结果DataFrame,列名为列对 columns = [f"Col{i+1}-Col{i+2}" for i in range(len(all_differences[0]))] result_df = pd.DataFrame(all_differences, columns=columns) # 保存到新CSV文件 result_df.to_csv("result.csv", index=False) 但需要注意,这里的列名可能需要更准确的命名,例如使用实际的列名(如B、C等)。然而,在读取时,header=None会导致列名为0到34(因为usecols=range(1,36)对应列索引1到35,但pandas的列索引从0开始,所以当读取usecols=1到35(即原来的列B到AJ)时,在DataFrame中的列索引是0到34。因此,相邻列对是0和1,1和2,...,34和35?不,原usecols选择的是列索引1到35(共35列,索引1到35),所以当读取时,DataFrame的列索引是0到34。因此,相邻列对是0和1,直到33和34。总共有34个差异。 因此,列名可以表示为B-C, C-D,...,AI-AJ,但如何将列索引转换为字母标签呢?比如,列索引0对应B,1对应C,依此类推。需要将数字索引转换为Excel列字母。 这可能需要一个函数将数字转换为对应的字母,例如,0对应B,1对应C,...,34对应AJ(因为原始范围是B到AJ,即从第二个列到第36列)。例如: 起始列为B(索引1),结束列为AJ(索引35,因为usecols=range(1,36)对应列1到35,即原始文件中的第2到第36列,即Excel中的B到AJ)。 但转换为列名时,读取时usecols=1到35对应的列在DataFrame中是0到34列。因此,每个列i对应的原始列号是i+1+起始列B的原始列号?可能需要重新考虑。 者,假设原始CSV文件的列是从A开始,那么usecols=range(1,36)对应的是B到AJ列(因为A是0,B是1,...,AJ是35?但Excel的列数从1开始,所以可能需要仔细确认。例如,Excel中列A是第1列,B是第2,依此类推。在pandas中,当读取CSV时,usecols的参数是基于0的索引。例如,要选择Excel中的B列(第2列),对应的索引是1。AJ列在Excel中是第36列,对应的索引是35。所以usecols=range(1,36)即从索引1到35,共35列,对应Excel的B到AJ。 因此,在DataFrame中,这些列的索引是0到34。每个列i对应的Excel列号是i+1(因为起始是B,即索引1)。例如,DataFrame列0对应Excel的B(索引1),列1对应C(索引2),直到列34对应AJ(索引35)。 因此,相邻列对的标签应该是B-C, C-D,...,AI-AJ。例如,列i和i+1对应Excel列i+1和i+2,即字母为列i+1和列i+2对应的字母。 因此,需要将数字转换为Excel列字母。例如,索引1对应B,索引2对应C,...,索引35对应AJ。因此,DataFrame的列0对应索引1(B),列1对应索引2(C),列34对应索引35(AJ)。 因此,相邻列对为B-C(列0和1),C-D(列1和2),..., AI-AJ(列33和34)。 为了生成正确的列名,需要将数字转换为对应的字母。例如,函数将数字转换为Excel列字母: def excel_column_name(n): """将数字转换为Excel列字母,例如0->A, 1->B, ..., 26->AA, 27->AB, etc.""" name = '' while n >= 0: name = chr(n % 26 + ord('A')) + name n = n // 26 - 1 return name 但可能更简单的是,从索引1到35转换为Excel列名。例如,索引1对应B,索引35对应AJ。 这里可能需要一个函数来将数字转换为Excel列字母,例如: def number_to_excel_col(n): """将数字转换为Excel列字母,n从0开始。例如0->A, 1->B, ..., 26->AA, 27->AB等。""" chars = [] while n >= 0: chars.append(chr(n % 26 + ord('A'))) n = n // 26 - 1 return ''.join(reversed(chars)) 例如: number_to_excel_col(0) → 'A' number_to_excel_col(1) → 'B' ... number_to_excel_col(34) → 'AI'?让我们测试一下。 可能需要调整索引。例如,在问题中的B34:AJ71,AJ对应的Excel列是第36列。假设用户使用的是Excel的列标签,其中B是第2列,AJ是第36列。因此,索引需要从1开始到35(因为usecols=1到35)。例如,索引1对应B,索引35对应AJ(第36列)。 所以,对于DataFrame中的列i,对应的Excel列号是i+1。例如,列0对应i+1=1 → B,列1对应i+1=2 → C,直到列34对应i+1=35 → AJ? 但根据Excel的列编号,AJ是第36列。因此,i+1=35对应的是AJ吗?者需要确认Excel列字母的转换。例如,列字母转换为数字: A=1, B=2, ..., Z=26, AA=27, AB=28, ..., AJ=36, ... 因此,AJ是第36列。对应的数字是35(如果从0开始的话)。但如何将数字转换为字母呢? 例如,一个函数可以将数字转换为字母: def get_excel_column_name(n): """n是0-based的索引,返回对应的Excel列名。例如0→A, 1→B, ..., 25→Z, 26→AA, etc.""" name = '' n += 1 # 转换为1-based while n > 0: n, remainder = divmod(n - 1, 26) name = chr(65 + remainder) + name return name 例如: get_excel_column_name(0) → 'A' get_excel_column_name(1) → 'B' ... get_excel_column_name(25) → 'Z' get_excel_column_name(26) → 'AA' get_excel_column_name(35) → 'AJ' → 因为35+1=36 → 36-1=35 → 35//26=1, 35%26=9 → 1→B, 9→J → BJ?但实际AJ是第36列。这可能有问题,所以需要重新计算。 正确的方式:例如,AJ是第36列: 36-1=35 35 // 26 = 1, 余数35 - 1*26 =9 → 所以第一个字母是A(1-1=0 → A),第二个字母是J(9+1=10 → J?者可能我的计算有误。可能需要重新调整函数。 正确的实现: def get_excel_column_name(n): """将1-based的数字转换为Excel列名。例如1→A, 2→B, ..., 26→Z, 27→AA, etc.""" name = '' while n > 0: n, remainder = divmod(n - 1, 26) name = chr(65 + remainder) + name return name 例如: get_excel_column_name(1) → 'A' get_excel_column_name(2) → 'B' ... get_excel_column_name(26) → 'Z' get_excel_column_name(27) → 'AA' get_excel_column_name(36) → 'AJ' 是的,因为36的处理: 36-1=35 35 divided by 26 → q=1, r=9 所以第一个字符是 J(9 + 65 =74 → 'J'),然后 q=1 → 1-1=0 → 0 divided by 26 → q=0, r=0 → 'A' 所以组合是 'AJ',正确。 因此,在代码中,对于DataFrame的列i,对应的Excel列号是起始列B(即Excel列号2)加上i。因为: usecols=range(1,36) → 列1到35(0-based的pandas读取),对应Excel的列号2到36(因为Excel列是1-based)。所以每个DataFrame的列i对应的Excel列号是i+1+1(因为usecols从1开始)?者需要重新计算。 者,可能更简单:当usecols=1到35,即pandas读取的是原始CSV文件的列1到列35(0-based),对应Excel的列2到36(1-based)。所以DataFrame中的列0对应原始列1(Excel列2,即B),列1对应原始列2(Excel列3,C),直到列34对应原始列35(Excel列36,AJ)。 因此,对于DataFrame中的列i,对应的Excel列号是i+2(例如,i=0 → 2 → B)。因此,相邻列i和i+1对应的Excel列号是i+2和i+3,列名为get_excel_column_name(i+2)和get_excel_column_name(i+3)。 因此,相邻列对的标签应为: for i in range(34): col1 = get_excel_column_name(i+2) col2 = get_excel_column_name(i+3) label = f"{col1}-{col2}" 例如,当i=0 → B-C,i=1 → C-D,...,i=33 → AJ-AK? 但原始范围是到AJ列,即Excel列36,所以i的范围是0到34-1=33?因为总共有34对相邻列(35列有34对)。 是的。因此,列名应生成从B-C到 AI-AJ。例如: 当i=0 → Excel列2和3 → B-C 当i=33 → Excel列35和36 → AI-AJ? Excel列35的字母是 AI?因为: get_excel_column_name(35) → 35+1=36 → AJ? 哦,前面计算发现,Excel列36的字母是AJ。那如果i=33,对应的列i=33在DataFrame中是第34列(因为从0开始),对应的Excel列号是33+2=35。那Excel列35的字母是 AI: 计算get_excel_column_name(35): 35 → 35 divided by 26 → 35//26=1, 35%26=9 → 1-1=0 → 0 divided by 26 → 0.余数为0 → 所以字母是 A 和 J,即AJ?者可能计算错误。 哦,原来函数是针对1-based的列号。例如,Excel列35是 AI,对吗? 根据函数get_excel_column_name(35): n=35 → 进入循环: n=35>0: n, remainder = divmod(35-1, 26) → divmod(34,26)(1,8) 所以第一个字符是 8 → I(65+8=73),然后n=1: n, remainder = divmod(1-1,26) → divmod(0,26)(0,0) 所以下一个字符是 0 → A →组合是 AI. 所以Excel列35对应AI,列36对应AJ. 因此,当i=33时,DataFrame中的列i=33对应的原始列号是33+1=34(usecols的索引是34,对应原始CSV列34,即Excel列35(AI)),而i+1=34对应原始列35,Excel列36(AJ)。因此,相邻列对是AI-AJ。 因此,列名标签应从B-C到AI-AJ,共34对。 因此,在代码中,生成列名的部分应该是: columns = [] for i in range(34): # 因为35列有34对相邻列 col1_num = 2 + i # Excel列号从2开始(B) col2_num = col1_num + 1 col1_name = get_excel_column_name(col1_num) col2_name = get_excel_column_name(col2_num) columns.append(f"{col1_name}-{col2_name}") 例如,当i=0 → 2 → B,3 → C → B-C i=33 → 35 → AI,36 → AJ → AI-AJ 这样生成的列名是正确的。 因此,修改代码中的列名为这些标签。 现在,整合到代码中: 首先定义get_excel_column_name函数: def get_excel_column_name(n): """将1-based的数字转换为Excel列名。例如1→A, 2→B, ..., 26→Z, 27→AA, etc.""" name = '' while n > 0: n, remainder = divmod(n - 1, 26) name = chr(65 + remainder) + name return name 然后生成列名: columns = [] for i in range(34): col1_num = 2 + i # 起始为B(列2) col2_num = col1_num + 1 col1 = get_excel_column_name(col1_num) col2 = get_excel_column_name(col2_num) columns.append(f"{col1}-{col2}") 然后将这些列名用于结果DataFrame。 因此,完整的代码示例: import pandas as pd import glob def get_excel_column_name(n): """将1-based的数字转换为Excel列名。例如1→A, 2→B, ..., 26→Z, 27→AA, etc.""" name = '' while n > 0: n, remainder = divmod(n - 1, 26) name = chr(65 + remainder) + name return name # 生成列名 columns = [] for i in range(34): # 35列共有34对相邻列 col1_num = 2 + i # 起始列是B(Excel列2) col2_num = col1_num + 1 col1 = get_excel_column_name(col1_num) col2 = get_excel_column_name(col2_num) columns.append(f"{col1}-{col2}") csv_files = glob.glob('path/to/csv/files/*.csv') all_differences = [] for file in csv_files: try: # 读取指定范围的数据:行34-71(跳过前33行,读取38行),列B到AJ(列索引1到35) df = pd.read_csv(file, skiprows=33, nrows=38, usecols=range(1,36), header=None) # 计算相邻列均值差 differences = [] for i in range(df.shape[1] - 1): # df.shape[1]是35列,循环34次 mean1 = df.iloc[:, i].mean() mean2 = df.iloc[:, i+1].mean() differences.append(mean1 - mean2) all_differences.append(differences) except Exception as e: print(f"处理文件{file}时出错: {e}") continue # 创建结果DataFrame result_df = pd.DataFrame(all_differences, columns=columns) # 保存到新的CSV文件 result_df.to_csv("相邻列均值差结果.csv", index=False) 这样,每个输入文件对应结果中的一行,包含所有相邻列的均值差,列名如B-C, C-D等,直到AI-AJ。最终结果保存在“相邻列均值差结果.csv”中。 需要注意的几点: 1. 文件路径需要替换为用户实际的CSV文件路径。 2. 确保每个CSV文件的格式一致,否则读取时可能出错。 3. 异常处理仅打印错误信息,可能根据需调整。 4. 如果某些文件的列数不足,导致usecols参数错误,需要处理。 5. 如果某些文件的行数不足38行,读取时nrows=38可能导致数据不足,计算均值可能不如预期。 此外,用户可能需要调整行数列数的选择,例如,如果B34:AJ71在Excel中包括标题行,可能需要调整skiprows的值。例如,如果前33行包括标题,但用户想从第34行开始读取数据,则skiprows=33是正确的。但如果有标题行,可能需要先读取标题,然后跳过相应行数。需要根据实际文件结构调整。 综上,上述代码应该能够满足用户的需。接下来需要生成相关问题。</think>要使用Python pandas计算多个CSV文件中指定范围(B34:AJ71)的相邻两列均值差异,并将结果保存到新CSV文件,可以按以下步骤操作: 1. **读取文件并选择范围** 使用`pd.read_csv`时,通过参数`skiprows=33`跳过前33行(对应Excel行34),`nrows=38`读取38行(覆盖Excel行34-71),`usecols=range(1,36)`选择列B到AJ(对应pandas列索引1-35)[^2]。 2. **计算相邻列均值差异** 遍历每对相邻列,计算均值差: ```python differences = [] for i in range(df.shape[1] - 1): mean1 = df.iloc[:, i].mean() mean2 = df.iloc[:, i+1].mean() differences.append(mean1 - mean2) ``` 3. **保存结果** 将结果按列对命名(如B-C、C-D等),并保存为新CSV文件: ```python result_df = pd.DataFrame([differences], columns=columns) result_df.to_csv("结果.csv", index=False) ``` 完整代码示例: ```python import pandas as pd import glob def get_excel_column_name(n): name = '' while n > 0: n, remainder = divmod(n - 1, 26) name = chr(65 + remainder) + name return name columns = [] for i in range(34): col1_num = 2 + i # B列对应Excel列号2 col1 = get_excel_column_name(col1_num) col2 = get_excel_column_name(col1_num + 1) columns.append(f"{col1}-{col2}") csv_files = glob.glob('path/to/files/*.csv') all_differences = [] for file in csv_files: try: df = pd.read_csv(file, skiprows=33, nrows=38, usecols=range(1,36), header=None) differences = [df.iloc[:,i].mean() - df.iloc[:,i+1].mean() for i in range(34)] all_differences.append(differences) except Exception as e: print(f"处理文件{file}出错: {e}") pd.DataFrame(all_differences, columns=columns).to_csv("相邻列均值差.csv", index=False) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值