如何基于值对pandas DataFrame的不同行进行重组转换?
Pandas DataFrame 结构转换方案
原DataFrame结构:
| 属性1 | 属性值1 | 属性2 | 属性值2 |
|---|---|---|---|
| a | 1 | b | 4 |
| b | 2 | a | 5 |
目标DataFrame结构:
| a | b |
|---|---|
| 1 | 2 |
| 5 | 4 |
解决方案
方法一:针对当前固定结构的直接构造
如果数据结构固定为两行,可直接提取对应位置的值快速构造目标DataFrame:
import pandas as pd # 初始化原DataFrame df = pd.DataFrame({ '属性1': ['a', 'b'], '属性值1': [1, 2], '属性2': ['b', 'a'], '属性值2': [4, 5] }) # 提取对应值生成目标DataFrame new_df = pd.DataFrame({ 'a': [df.loc[0, '属性值1'], df.loc[1, '属性值2']], 'b': [df.loc[1, '属性值1'], df.loc[0, '属性值2']] }) print(new_df)
输出结果:
a b 0 1 2 1 5 4
方法二:通用化处理(适配多场景)
如果后续数据行数不确定,或属性可能出现在属性1/属性2任意列中,可通过遍历提取目标属性值:
import pandas as pd df = pd.DataFrame({ '属性1': ['a', 'b'], '属性值1': [1, 2], '属性2': ['b', 'a'], '属性值2': [4, 5] }) a_values = [] b_values = [] # 遍历每行,收集a、b对应的属性值 for _, row in df.iterrows(): if row['属性1'] == 'a': a_values.append(row['属性值1']) elif row['属性1'] == 'b': b_values.append(row['属性值1']) if row['属性2'] == 'a': a_values.append(row['属性值2']) elif row['属性2'] == 'b': b_values.append(row['属性值2']) # 构造目标DataFrame new_df = pd.DataFrame({'a': a_values, 'b': b_values}) print(new_df)
该方法可灵活处理属性位置变化、行数扩展的场景。
内容的提问来源于stack exchange,提问作者Renee D
相关产品推荐
相关产品推荐

