Python导入含空行分隔数据的CSV时,如何动态拆分列?
处理含空行分隔组的单列CSV数据
我有一个仅含一列整数值的CSV文件,里面用空行分隔不同学生的科目成绩(每个空行区间对应一个学生的所有成绩),但每个学生的成绩行数各不相同。数据示例如下:
63 67 86 90 45 69 90 78 85 40 93 53 55 67 38 92 75 94 73 ...
用pd.read_csv('input_data.txt', header=None)导入时,pandas会自动忽略空行,把所有成绩合并成一列,没法区分不同学生的成绩组,输出结果类似:
0 0 63 1 67 2 86 3 90 4 45 5 69 6 90 7 78 ...
解决方法
方法1:手动读取文件分组
直接读取文件内容,按空行分割成不同学生的成绩块,再转成DataFrame:
import pandas as pd # 读取文件内容,按空行分割每个学生的成绩块 with open('input_data.txt', 'r') as f: content = f.read().split('\n\n') # 处理每个块,过滤空内容并转成整数列表 student_scores = [] for block in content: scores = [int(num) for num in block.strip().split('\n') if num.strip()] if scores: # 跳过空块 student_scores.append(scores) # 转成DataFrame,每行对应一个学生的成绩列表 df = pd.DataFrame({'student_scores': student_scores})
输出示例:
student_scores 0 [63, 67, 86, 90] 1 [45, 69, 90] 2 [78, 85, 40, 93, 53, 55, 67] 3 [38, 92, 75, 94, 73]
如果想把每个成绩拆成单独列(用NaN补全对齐):
# 找到最长的成绩列表长度 max_len = max(len(scores) for scores in student_scores) # 补NaN对齐所有学生的成绩 aligned_scores = [scores + [pd.NA]*(max_len - len(scores)) for scores in student_scores] # 转成带列名的DataFrame df = pd.DataFrame(aligned_scores, columns=[f'score_{i+1}' for i in range(max_len)])
输出示例:
score_1 score_2 score_3 score_4 score_5 score_6 score_7 0 63 67 86 90 <NA> <NA> <NA> 1 45 69 90 <NA> <NA> <NA> <NA> 2 78 85 40 93 53 55 67 3 38 92 75 94 73 <NA> <NA>
方法2:用pandas内置功能分组
先读取所有行(包括空行),再通过空行标记分组:
import pandas as pd # 读取所有行,空行显示为空字符串(keep_default_na=False) df_raw = pd.read_csv('input_data.txt', header=None, keep_default_na=False) # 创建分组ID:每遇到一个空行,分组ID加1 group_id = (df_raw[0] == '').cumsum() # 分组聚合成绩,过滤掉空行对应的组 df = df_raw[df_raw[0] != ''].groupby(group_id).agg(list).reset_index(drop=True) df.columns = ['student_scores']
这个方法全程用pandas操作,效果和方法1一致。
内容的提问来源于stack exchange,提问作者pallab bhattacharya
相关产品推荐
相关产品推荐

