将CSV中多组Name与Age列合并为两列的Pandas技术需求
解决多组Age/Name列堆叠并过滤NaN的问题
问题分析
需要将包含多组重复Age和Name列的DataFrame(示例为6列,实际2000列)按从左到右的组顺序堆叠成两列,同时忽略Name为NaN或Name与Age均为NaN的行。
解决方案代码
import pandas as pd import numpy as np # 示例数据 data = [['11', 'Nick', '10', 'Dave', '4', 'Greg'], ['7', 'Nick', '10', 'Steve', '4', 'Jeff'], ['1', 'Brad', np.nan, 'Jim', '3', "jas"], ['1','Steve', '2', 'Jack', np.nan,np.nan]] df = pd.DataFrame(data, columns=['Age','Name', 'Age', 'Name', 'Age', 'Name']) # 初始化结果DataFrame result = pd.DataFrame(columns=['Age', 'Name']) # 按每两列一组遍历(匹配Age+Name的组结构) for i in range(0, len(df.columns), 2): # 提取当前组的Age和Name列 group = df.iloc[:, [i, i+1]] # 统一列名,避免重复列名冲突 group.columns = ['Age', 'Name'] # 过滤掉Name为NaN的行(自动包含Name+Age均为NaN的情况) group_filtered = group.dropna(subset=['Name']) # 按组顺序追加到结果中 result = pd.concat([result, group_filtered], ignore_index=True) # 输出结果 print(result)
代码说明
- 分组遍历:通过
range(0, len(df.columns), 2)按每两列一组提取数据,严格保证从左到右的组顺序不被打乱。 - 列名统一:将每组的重复列名重命名为
Age和Name,避免拼接时的列名冲突。 - NaN过滤:使用
dropna(subset=['Name'])精准过滤掉Name为NaN的行,同时自动覆盖Name与Age均为NaN的情况。 - 顺序拼接:用
pd.concat按组顺序追加数据,ignore_index=True重置索引,生成连续的结果序列。
输出结果
Age Name 0 11 Nick 1 7 Nick 2 1 Brad 3 1 Steve 4 10 Dave 5 10 Steve 6 NaN Jim 7 2 Jack 8 4 Greg 9 4 Jeff 10 3 jas
内容的提问来源于stack exchange,提问作者sdpro19
相关产品推荐
相关产品推荐

