我有一个数据集,我想在其中将值解聚合到它们自己的唯一行中,并执行透视,按类别分组。
数据已更新
Period Date Area BB stat AA stat CC stat DD stat BB test AA test CC test DD test BB re AA re CC re BB test2 AA test2 CC test2 DD test2
8/1/2016 9/1/2016 NY 5 5 5 1 1 1 0 0 0 0 0 0 0
9/1/2016 10/1/2016 NY 6 6 6 4 4 4 0 0 0 0 0 0 0
8/1/2016 9/1/2016 CA 2 2 2 4 4 4 0 0 0 0 0 0 0
9/1/2016 10/1/2016 CA 1 1 1 -2 -2 -2 0 0 0 0 0 0 0
期望
Period Date Area stat test type re test2
8/1/2016 9/1/2016 NY 5 1 BB 0 0
9/1/2016 10/1/2016 NY 6 4 BB 0 0
8/1/2016 9/1/2016 NY 5 1 AA 0 0
9/1/2016 10/1/2016 NY 6 4 AA 0 0
8/1/2016 9/1/2016 NY 5 1 CC 0 0
9/1/2016 10/1/2016 NY 6 4 CC 0 0
8/1/2016 9/1/2016 NY 0 0 DD 0 0
9/1/2016 10/1/2016 NY 0 0 DD 0 0
8/1/2016 9/1/2016 CA 2 4 BB 0 0
9/1/2016 10/1/2016 CA 1 -2 BB 0 0
8/1/2016 9/1/2016 CA 2 4 AA 0 0
9/1/2016 10/1/2016 CA 1 -2 AA 0 0
8/1/2016 9/1/2016 CA 2 4 CC 0 0
9/1/2016 10/1/2016 CA 1 -2 CC 0 0
8/1/2016 9/1/2016 CA 0 0 DD 0 0
9/1/2016 10/1/2016 CA 0 0 DD 0 0
做
value_vars = ["BB stat", "AA stat", "CC stat", "DD stat", "BB test",
"AA test", "CC test", "DD test", "BB re", "AA re", "CC re"]
df = df.melt(id_vars=["Period", "Date", "Area"], value_vars=value_vars)
temp_df = df.variable.str.split("_", 1, expand=True)
df["type"] = temp_df[0]
df["name"] = temp_df[1]
df = df.drop(columns=["variable"])
first_half = df.iloc[:len(df)//2]
second_half = df.iloc[len(df)//2:]
df = pd.merge(first_half, second_half, on=["Period", "Date", "Area", "type"], suffixes=("_1", "_2"))
df.rename(columns = {'value_3':'stat''value_2':'test', 'value_1':'re'}, inplace = True)
df.drop(columns=["name_1", "name_2"], inplace=True)
df = df[[ "Period", "Date", "Area", "stat", "test", "type", "re" ]]
df.sort_values(["Area", "type"], ascending=False, inplace=True)
df.to_markdown()
以下代码无法捕获所有输出列。欢迎提出任何建议。
4条答案
按热度按时间dly7yett1#
尝试
pd.wide_to_long
:输出:
vcirk6k62#
问得好。
我认为我们需要做的是使用a pivot table
ffscu2ro3#
一个选项是使用pivot_longer from pyjanitor-在这种情况下,我们使用特殊的占位符
.value
来标识列中我们希望保留为标题的部分,而其余部分则被整理到新列中:另一个选项,使用
pd.stack
:4si2a6ki4#
另一种可能的解决方案:
输出: