首页 > 解决方案 > 尝试按名称将多组列堆叠成多个目标列

问题描述

我有像这样的原始数据框,它包含 1772 列和 130 行。我想将它们堆叠成多个目标列。

ID AA_F1R1 BB_F1R1 AA_F1R2 BB_F1R2 ... AA_F2R1 BB_F2R2 ... AA_F7R25 BB_F7R25
001 5 xy xx xx 1 4 xx
002 6 zzz 年年 zzz xw 2 zzz 3 zzz

我发现了两种不同的解决方案,它们似乎可行,但对我来说却是一个错误。不确定它们是否适用于 NaN 值。

pd.wide_to_long(df, stubnames=['AA', 'BB'], i='id', j='dropme', sep='_')\
  .reset_index()\
  .drop('dropme', axis=1)\
  .sort_values('id')
Output:
0 rows × 1773 columns

我尝试的另一个解决方案是

df.set_index('id', inplace=True)
df.columns = pd.MultiIndex.from_tuples(tuple(df.columns.str.split("_")))
df.stack(level = 1).reset_index(level = 1, drop = True).reset_index()

Output:
150677 rows × 2 columns 

最后一个的问题是我无法保留我想要的列。

我很感激任何投入!

标签: pythonpandasdataframe

解决方案


使用suffix=r'\w+'参数wide_to_long

df = pd.wide_to_long(df, stubnames=['AA','BB'], i='id', j='dropme', sep='_', suffix=r'\w+')\
  .reset_index()\
  .drop('dropme', axis=1)\
  .sort_values('id')

dropna=False在第二个解决方案中添加DataFrame.stack

df.set_index('id', inplace=True)
df.columns = df.columns.str.split("_", expand=True)
df = df.stack(level = 1, dropna=False).reset_index(level = 1, drop = True).reset_index()

推荐阅读