【问题标题】:Aggregate columns to rows using column names使用列名将列聚合到行
【发布时间】:2019-12-09 21:09:07
【问题描述】:

我有以下数据框

df = pd.DataFrame({'ID':[1,2,3],'Q8_4_1':[1,2,3], 'Q8_5_1':[2,5,7],'Q8_4_2':[6,7,8], 'Q8_5_2':[9,10,11]})

这些列仅代表不同文件的相同变量。因此,结构如下 Q8_4_(file1)、Q8_4_(file2) 等。我想将数据框转换为具有以下表示:

目前我正在运行一个不太理想的解决方案,其中涉及对列索引进行硬编码并按 file_id 拆分数据帧,如下所示:

df1 = df.iloc[:,:3]
df1.columns = ["ID","Q8_4","Q_5"]
df1["File_ID"] = 1

df2 = df.iloc[:,3:]
df2["ID"] = df["ID"]
df2.columns = ["ID","Q8_4","Q_5"]
df2["File_ID"] = 2

pd.concat([df1,df2],axis=0)

是否有任何 Pandas 功能可以帮助我在可扩展的级别上实现这一目标?

【问题讨论】:

  • 使用枢轴选项
  • 小心。如果您使用 df.columns 重命名,则序列可能会更改。尝试使用 df.rename(columns=Dict)。在这种情况下,您实际上将 Q8_5_2 与 Q8_4_1 连接起来。我认为这不是您所期望的。

标签: python pandas


【解决方案1】:
# Step 0: create the dataframe
df = pd.DataFrame({'ID':[1,2,3],'Q8_4_1':[1,2,3], 'Q8_5_1':[2,5,7],'Q8_4_2':[6,7,8], 'Q8_5_2':[9,10,11]}).set_index("ID")

# Step 1: create a function to split the column names
def split_col(s): 
    comp = s.split("_") 
    return "_".join(comp[:-1]), comp[-1] 

# Step 2: create a new index for the columns and update it
df.columns = pd.MultiIndex.from_tuples(list(map(split_col, df.columns)))

# Step 3: stack based on level #1
df = df.stack(level=1)

# Step 4: nope, that's it

【讨论】:

  • 看起来不错,谢谢!添加 df = df.reset_index() df.rename(columns={"level_1":"File_ID"},inplace=True) 到您的解决方案给了我想要的输出
【解决方案2】:

axis=1concat 上使用groupby 的另一种方式:

col=df.columns[1:].str.rsplit('_',1).str[0]

final=pd.concat([g.stack().droplevel(1) for _,g in 
               df.set_index('ID').groupby(col,axis=1)],axis=1,keys=col).reset_index()
final=final.assign(File_ID=final.groupby('ID').cumcount()+1)
print(final)

   ID  Q8_4  Q8_5  File_ID
0   1     1     2        1
1   1     6     9        2
2   2     2     5        1
3   2     7    10        2
4   3     3     7        1
5   3     8    11        2

【讨论】:

    猜你喜欢
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多