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.:我明白了……你已经编辑过了。非常感谢。我甚至都不明白…非常感谢你的帮助,让我知道我错在哪里了。再次感谢。