Python 如何重塑要堆叠的重复宽数据帧?

Python 如何重塑要堆叠的重复宽数据帧?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据框,受访者在多个销售账户上回答相同的问题。我的输入数据帧的格式如下 df=pd.DataFrame({“Sales_Acc1”:[100300], “销售核算2”:[200500], “时间1”:[2,5], “时间2”:[6,9], “附件编号附件1”:[10011005], “附件编号附件2”:[10091010]}, 索引=[“约翰”、“戴夫”]) df >>>销售\科目1销售\科目2时间\科目1时间\科目2科目\编号\科目1科目\编号\科目2 约翰100 200 2 6

我有一个熊猫数据框,受访者在多个销售账户上回答相同的问题。我的输入数据帧的格式如下

df=pd.DataFrame({“Sales_Acc1”:[100300],
“销售核算2”:[200500],
“时间1”:[2,5],
“时间2”:[6,9],
“附件编号附件1”:[10011005],
“附件编号附件2”:[10091010]},
索引=[“约翰”、“戴夫”])
df
>>>销售\科目1销售\科目2时间\科目1时间\科目2科目\编号\科目1科目\编号\科目2
约翰100 200 2 6 1001 1009
戴夫300 500 5 9 1005 1010
我希望将此作为轴心,以便每个帐户都有自己的行。 我想要的结束数据帧如下所示:

df
>>>AccountNumber代表销售时间
约翰1002
1005约翰300 6
1009戴夫200 5
1010戴夫500 9
我试过使用melt和pivot,但我想不出来。非常感谢您的帮助。

这是一个问题,因为您的专栏的格式是
'stub\u SomeSuffix'
。因为你有一些不一致的情况,我们会把一切都降低。我们还需要从
索引
中删除名称,因为
宽到长
需要列

df.columns = df.columns.str.lower()

df = (pd.wide_to_long(df.rename_axis('Rep').reset_index(),    # Use Rep as index
                      i='Rep',                                # index of output
                      j='will_drop',                          # Suffix labels  
                      stubnames=['sales', 'acc_number', 'time'],
                      sep='_', 
                      suffix='.*') 
        .reset_index()
        .drop(columns='will_drop'))

#    Rep  sales  acc_number  time
#0  John    100        1001     2
#1  Dave    300        1005     5
#2  John    200        1009     6
#3  Dave    500        1010     9

如果您不喜欢
wide\u to\u long
所需的无休止的参数,我们可以在列上创建一个简单的
multi-index
,然后这就是一个
堆栈。同样,由于不一致的外壳,我们使所有列完全小写

df.columns = pd.MultiIndex.from_arrays(zip(*df.columns.str.lower().str.rsplit('_', n=1)))
#     sales      time      acc_number      
#      acc1 acc2 acc1 acc2       acc1  acc2
#John   100  200    2    6       1001  1009
#Dave   300  500    5    9       1005  1010

df.stack(-1).reset_index(-1, drop=True)
#      acc_number  sales  time
#John        1001    100     2
#John        1009    200     6
#Dave        1005    300     5
#Dave        1010    500     9
这是一个问题,因为您的列的格式为
“stub\u SomeSuffix”
。因为你有一些不一致的情况,我们会把一切都降低。我们还需要从
索引
中删除名称,因为
宽到长
需要列

df.columns = df.columns.str.lower()

df = (pd.wide_to_long(df.rename_axis('Rep').reset_index(),    # Use Rep as index
                      i='Rep',                                # index of output
                      j='will_drop',                          # Suffix labels  
                      stubnames=['sales', 'acc_number', 'time'],
                      sep='_', 
                      suffix='.*') 
        .reset_index()
        .drop(columns='will_drop'))

#    Rep  sales  acc_number  time
#0  John    100        1001     2
#1  Dave    300        1005     5
#2  John    200        1009     6
#3  Dave    500        1010     9

如果您不喜欢
wide\u to\u long
所需的无休止的参数,我们可以在列上创建一个简单的
multi-index
,然后这就是一个
堆栈。同样,由于不一致的外壳,我们使所有列完全小写

df.columns = pd.MultiIndex.from_arrays(zip(*df.columns.str.lower().str.rsplit('_', n=1)))
#     sales      time      acc_number      
#      acc1 acc2 acc1 acc2       acc1  acc2
#John   100  200    2    6       1001  1009
#Dave   300  500    5    9       1005  1010

df.stack(-1).reset_index(-1, drop=True)
#      acc_number  sales  time
#John        1001    100     2
#John        1009    200     6
#Dave        1005    300     5
#Dave        1010    500     9
我的解决方案就是这么简单,在这种情况下,我们基本上是将列放在不同的行中

首先选择相关列,然后重命名列名并将其附加到另一列以获得最终结果

这是完整的代码:

import pandas as pd
df = pd.DataFrame({"Sales_Acc1":[100,300],
              "Sales_Acc2":[200,500],
              "Time_Acc1":[2,5],
              "Time_acc2":[6,9],
              "Acc_Number_acc1":[1001,1005],
              "Acc_Number_acc2":[1009,1010]},
             index=["John","Dave"])
df1=df[['Sales_Acc1','Time_Acc1','Acc_Number_acc1']]
df2=df[['Sales_Acc2','Time_acc2','Acc_Number_acc2']]
df1.columns=['Sales_Acc','Time_Acc','Acc_Number']
df2.columns=['Sales_Acc','Time_Acc','Acc_Number']
df3 = df1.append(df2)
df3.index.names = ['Rep']
df3.head()
输出:

我的解决方案就是这么简单,在这种情况下,我们基本上是将列放在不同的行中

首先选择相关列,然后重命名列名并将其附加到另一列以获得最终结果

这是完整的代码:

import pandas as pd
df = pd.DataFrame({"Sales_Acc1":[100,300],
              "Sales_Acc2":[200,500],
              "Time_Acc1":[2,5],
              "Time_acc2":[6,9],
              "Acc_Number_acc1":[1001,1005],
              "Acc_Number_acc2":[1009,1010]},
             index=["John","Dave"])
df1=df[['Sales_Acc1','Time_Acc1','Acc_Number_acc1']]
df2=df[['Sales_Acc2','Time_acc2','Acc_Number_acc2']]
df1.columns=['Sales_Acc','Time_Acc','Acc_Number']
df2.columns=['Sales_Acc','Time_Acc','Acc_Number']
df3 = df1.append(df2)
df3.index.names = ['Rep']
df3.head()
输出:


你能提供一个我可以正确学习龙头湾的资源吗?这是我第一次读这篇文章。在你的答案面前,我的答案似乎很愚蠢。我想我应该删除它。我将投你的一票。很多事情我都知道了。@user27286事实上不,你的还不错,只是有点手动。我将在我的选项中添加另一个选项,向您展示如何使用更少的手动书写来完成此操作。感谢您的回复。在df之前,*修饰符做什么?@VictorNogueira本质上是解压元素。在中有一个比我在评论中提供的更好的解释。再想一想,从元组构造多索引可能有点清楚。你可以从元组(df.columns.str.lower().str.rsplit(“”,n=1.tolist())执行pd.MultiIndex.from
。你能提供一个我可以正确学习longtowide的资源吗?这是我第一次读这篇文章。在你的答案面前,我的答案似乎很愚蠢。我想我应该删除它。我将投你的一票。很多事情我都知道了。@user27286事实上不,你的还不错,只是有点手动。我将在我的选项中添加另一个选项,向您展示如何使用更少的手动书写来完成此操作。感谢您的回复。在df之前,*修饰符做什么?@VictorNogueira本质上是解压元素。在中有一个比我在评论中提供的更好的解释。再想一想,从元组构造多索引可能有点清楚。您可以从元组(df.columns.str.lower().str.rsplit(“”,n=1).tolist())执行
pd.MultiIndex.from
)。您的答案中有一个小的输入错误,您在引用它之前从未定义过
df3
,导致
名称错误。(我做了小小的调整)。我猜这就是造成原版的原因downvote@ALollz.:我已运行此代码
df3
是一个新变量。这段代码运行。并给出以下输出。我又跑了一遍。你确定这就是问题所在吗?@ALollz.:我明白了……你已经编辑过了。非常感谢。我甚至都不明白…非常感谢你的帮助,让我知道我错在哪里了。再次感谢。您的答案中有一个小的输入错误,您在引用它之前从未定义过
df3
,这导致了
名称错误
。(我做了小小的调整)。我猜这就是造成原版的原因downvote@ALollz.:我已运行此代码
df3
是一个新变量。这段代码运行。并给出以下输出。我又跑了一遍。你确定这就是问题所在吗?@ALollz.:我明白了……你已经编辑过了。非常感谢。我甚至都不明白…非常感谢你的帮助,让我知道我错在哪里了。再次感谢。