如何将DataFrame每行非空值前置、空值后置并导出CSV?
如何将Pandas DataFrame每行非空值前置、空值后置并导出CSV
问题背景
我需要处理一个Pandas DataFrame,实现每行的非空值移到前面、空值(NaN)移到后面,最后把处理结果导出成CSV文件。
现有代码:
df = pd.read_csv('dataset_two.csv', header=None) print(df.head()) print("___ ___ ___ ___ ___ ___ ___ ___ ___")
原始数据输出:
0 Juice Nachos Tortilla Cheese Eggs Banana Milk Bread Butter 1 Juice NaN Tortilla Cheese Eggs NaN Milk NaN Butter 2 NaN NaN Tortilla Cheese Eggs NaN NaN Bread Butter 3 NaN Nachos NaN NaN NaN Banana Milk Bread NaN 4 Juice Nachos Tortilla Cheese Eggs Banana Milk Bread Butter ___ ___ ___ ___ ___ ___ ___ ___ ___
期望导出的CSV格式:
Juice,Nachos,Tortilla,Cheese,Eggs,Banana,Milk,Bread,Butter Juice,Tortilla,Cheese,Eggs,Milk,Butter Tortilla,Cheese,Eggs,Bread,Butter Nachos,Banana,Milk,Bread Juice,Nachos,Tortilla,Cheese,Eggs,Banana,Milk,Bread,Butter
解决方案
以下是两种实现方式,分别对应不同的输出需求:
方式一:保留所有列(空值后置)
如果需要保留原有的列数,仅将非空值移到前面、空值放在后面,可使用以下代码:
import pandas as pd # 读取原始数据集 df = pd.read_csv('dataset_two.csv', header=None) # 定义行处理函数:拆分非空值与空值后拼接 def rearrange_row(row): non_null_vals = row[pd.notna(row)].tolist() null_vals = row[pd.isna(row)].tolist() return non_null_vals + null_vals # 逐行应用处理逻辑,生成新DataFrame processed_df = df.apply(rearrange_row, axis=1).apply(pd.Series) # 导出CSV,不写入行索引和表头 processed_df.to_csv('processed_full.csv', index=False, header=False)
方式二:仅保留非空值(无末尾空字段)
如果希望导出的CSV每行只包含非空值(完全匹配你给出的期望输出),可以直接迭代每行生成字符串写入文件:
import pandas as pd df = pd.read_csv('dataset_two.csv', header=None) # 打开输出文件并写入处理后的数据 with open('processed_clean.csv', 'w') as output_file: for _, row in df.iterrows(): # 过滤非空值并转为逗号分隔的字符串 cleaned_row = ','.join(row[pd.notna(row)].astype(str)) output_file.write(f"{cleaned_row}\n")
关键说明
pd.notna(row)用于精准筛选每行的非空值,确保只保留有效数据;- 方式一适合需要保留原列结构的场景,处理后仍保持相同的列数;
- 方式二直接生成无冗余空字段的行内容,完全符合你给出的期望输出格式。
内容的提问来源于stack exchange,提问作者Nikhil
相关产品推荐
相关产品推荐

