如何基于列值重塑Pandas DataFrame?unstack尝试未果
解决Pandas按分组列重塑DataFrame的高效方法
嘿,我完全懂你要实现的需求——把每个城市对应的weather和temp列拆成独立的专属列,而且因为数据集大,不想用效率低下的循环对吧?你之前尝试unstack()没成功,大概率是因为缺少一个用来对齐每组行的索引标记,我来给你个高效的矢量化解决方案:
步骤详解
首先,我们需要给每个城市的分组添加一个组内行号,用来对齐不同城市的对应行(毕竟每个城市都有3条记录,需要一一对应),然后通过pivot+unstack的组合来重塑数据,最后整理列名即可。
完整代码实现
import pandas as pd # 原始数据 d = {'city': ['Berlin', 'Berlin', 'Berlin', 'London', 'London', 'London'], 'weather': ['sunny', 'sunny', 'cloudy','sunny', 'cloudy', 'cloudy'], 'temp': [20,22,19, 21, 18, 17]} df = pd.DataFrame(data=d) # 1. 添加组内行号,用于对齐不同城市的行 df['row_id'] = df.groupby('city').cumcount() # 2. 重塑数据:先按行号和城市做透视,再展开城市维度 reshaped_df = df.pivot(index='row_id', columns='city').unstack() # 3. 整理列名,合并成「城市_列名」的格式 reshaped_df.columns = [f'{city}_{col}' for city, col in reshaped_df.columns] # 4. 去掉多余的行索引,得到最终结果 df_2 = reshaped_df.reset_index(drop=True) print(df_2)
运行后输出的df_2就和你想要的完全一致:
Berlin_weather Berlin_temp London_weather London_temp 0 sunny 20 sunny 21 1 sunny 22 cloudy 18 2 cloudy 19 cloudy 17
为什么这个方法高效?
这个方案用的是Pandas原生的矢量化操作,完全避免了循环,在处理大型数据集时,效率比循环高几个数量级——矢量化操作是Pandas处理大数据的核心优势,它会在底层用C语言级别的运算替代Python层面的循环迭代。
补充:为什么之前的unstack没成功?
你之前单独用unstack()失败,是因为原始数据没有一个能让不同城市行对齐的索引。添加row_id后,每个城市的第N行都会对应同一个row_id,这样unstack才知道如何把不同城市的同位置行放在同一行里。
内容的提问来源于stack exchange,提问作者emil banning
相关产品推荐
相关产品推荐

