【问题标题】:Python - Restructure Dataframe, move column names to rows, reshape dataframePython - 重组数据框,将列名移动到行,重塑数据框
【发布时间】:2017-04-04 14:59:25
【问题描述】:

我需要将 df1 转换为 df2:

import pandas as pd
from pandas import DataFrame, Series

import numpy as np

df1 = pd.DataFrame(index=['date_1', 'date_2', 'date_3'], 
              columns=["A_count", "A_dollar", "B_count", "B_dollar"], 
              data=[[10,"$100",7,"$786"], [3,"$43",6,"$88"],     [5,"$565",8,"$876"]])
df1

基本上我需要将项目(A 和 B)作为标签放在一个新列中,然后将第 3 列和第 4 列数据移动到 A 项目下的每一行。这将为每个日期提供一个新行。

【问题讨论】:

    标签: python pandas dataframe reshape reindex


    【解决方案1】:

    您可以通过使用下划线将列拆分为多索引,然后使用stack 将其重新整形为长格式:

    df1.columns = df1.columns.str.split("_", expand=True)
    df1.stack(level=0).rename_axis((None, "item")).reset_index("item")
    

    如果列名中有多个下划线如下:

    df1 = pd.DataFrame(index=['date_1', 'date_2', 'date_3'], 
                  columns=["A_x_count", "A_x_dollar", "B_y_count", "B_y_dollar"], 
                  data=[[10,"$100",7,"$786"], [3,"$43",6,"$88"],     [5,"$565",8,"$876"]])
    df1
    

    您可以将rsplit 与n = 1 一起使用,这样它只会在最后一个下划线处拆分:

    df1.columns = df1.columns.str.rsplit("_", n=1, expand=True)
    df1.stack(level=0).rename_axis((None, "item")).reset_index("item")
    

    【讨论】:

    • 感谢您的快速回复。如果原始列名已经有“”并且我只想用最后一个“”分割名称怎么办?
    • "" 是什么意思?空字符串?
    • 抱歉,由于某种原因下划线没有显示。 “下划线”、“_”
    • 如果列名中有多个下划线,并且要在最后一个下划线分割,可以使用rsplit(右分割),最大分割为1。所以df1.columns = df1.columns.str.rsplit("_", n=1, expand=True) 应该可以工作。
    • 感谢 Psidom,我真的很感激。让我在更大的数据集上尝试您的解决方案,一旦完成测试,我将接受答案。祝你好运:)
    猜你喜欢
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2020-11-16
    相关资源
    最近更新 更多