分组生成新DataFrame时,如何添加值来源的标识列?
解决方案
你可以调整原有代码,结合melt函数同时提取值和对应的来源列名,具体实现如下:
import pandas as pd # 初始化你的原始DataFrame A df = pd.DataFrame({ 'Col A': [1000, 1000, 2000, 2000], 'Col B': [100, 100, 200, 200], 'Col C': [10, 20, 30, 40] }) # 生成目标DataFrame B out = (df.groupby('Col A', group_keys=False, sort=False) # 对每个分组逆序列,再转成窄表自动保留来源列名 .apply(lambda d: d.iloc[:, ::-1].melt(var_name='Col C', value_name='Col A & B')) # 去除重复的(值+来源)组合 .drop_duplicates(subset=['Col A & B', 'Col C']) .reset_index(drop=True) # 调整列顺序匹配需求 [['Col A & B', 'Col C']] ) print(out)
代码说明:
groupby('Col A', sort=False):保持原数据的分组顺序,避免打乱结果的排列逻辑。d.iloc[:, ::-1]:将每个分组的列逆序(从Col C到Col A),确保提取顺序和你需要的输出一致。melt(...):把宽表转为窄表,var_name存储原列名(即值的来源),value_name存储对应的值。drop_duplicates(...):去除重复的数值-来源组合,避免原数据中重复行导致的冗余结果。
运行后得到的结果完全匹配你给出的DataFrame B:
| Col A & B | Col C |
|---|---|
| 10 | Col C |
| 20 | Col C |
| 100 | Col B |
| 1000 | Col A |
| 30 | Col C |
| 40 | Col C |
| 200 | Col B |
| 2000 | Col A |
内容的提问来源于stack exchange,提问作者John Mark Johnson
相关产品推荐
相关产品推荐

