Pandas:通过拆分列和变量中的列来重塑数据框
Pandas: reshaping dataframe by splitting columns in a column and a variable
我有以下要融化的数据框:
import numpy as np
import pandas as pd
dates = pd.date_range('1/1/2014', periods=4)
df = pd.DataFrame(np.eye(4, ), index=dates, columns=['A_var1', 'A_var2', 'B_var1', 'B_var2'])
print(df)
A_var1 A_var2 B_var1 B_var2
2014-01-01 1.0 0.0 0.0 0.0
2014-01-02 0.0 1.0 0.0 0.0
2014-01-03 0.0 0.0 1.0 0.0
2014-01-04 0.0 0.0 0.0 1.0
我想获取以下内容:
type var1 var2
2014-01-01 A 1.0 0.0
2014-01-01 B 0.0 0.0
2014-01-02 A 0.0 1.0
2014-01-02 B 0.0 0.0
2014-01-03 A 0.0 0.0
2014-01-03 B 1.0 0.0
2014-01-04 A 0.0 0.0
2014-01-04 B 0.0 1.0
知道如何有效地做到这一点吗?我知道我可以使用 melt 函数,但我无法让它在那种情况下工作。
非常感谢,
您可以在多索引列上使用 stack
。
In [304]: df.columns = df.columns.str.split('_', expand=True)
In [305]: df.stack(0).reset_index(1)
Out[305]:
level_1 var1 var2
2014-01-01 A 1.0 0.0
2014-01-01 B 0.0 0.0
2014-01-02 A 0.0 1.0
2014-01-02 B 0.0 0.0
2014-01-03 A 0.0 0.0
2014-01-03 B 1.0 0.0
2014-01-04 A 0.0 0.0
2014-01-04 B 0.0 1.0
一个选项是 pivot_longer function from pyjanitor,使用 .value
占位符:
# pip install pyjanitor
import pandas as pd
import janitor
df.pivot_longer(names_to=("type", ".value"),
names_sep="_",
ignore_index=False,
sort_by_appearance = True)
type var1 var2
2014-01-01 A 1.0 0.0
2014-01-01 B 0.0 0.0
2014-01-02 A 0.0 1.0
2014-01-02 B 0.0 0.0
2014-01-03 A 0.0 0.0
2014-01-03 B 1.0 0.0
2014-01-04 A 0.0 0.0
2014-01-04 B 0.0 1.0
.value
将与其关联的列的一部分保留为 header,而其余部分进入 type
列。
我有以下要融化的数据框:
import numpy as np
import pandas as pd
dates = pd.date_range('1/1/2014', periods=4)
df = pd.DataFrame(np.eye(4, ), index=dates, columns=['A_var1', 'A_var2', 'B_var1', 'B_var2'])
print(df)
A_var1 A_var2 B_var1 B_var2
2014-01-01 1.0 0.0 0.0 0.0
2014-01-02 0.0 1.0 0.0 0.0
2014-01-03 0.0 0.0 1.0 0.0
2014-01-04 0.0 0.0 0.0 1.0
我想获取以下内容:
type var1 var2
2014-01-01 A 1.0 0.0
2014-01-01 B 0.0 0.0
2014-01-02 A 0.0 1.0
2014-01-02 B 0.0 0.0
2014-01-03 A 0.0 0.0
2014-01-03 B 1.0 0.0
2014-01-04 A 0.0 0.0
2014-01-04 B 0.0 1.0
知道如何有效地做到这一点吗?我知道我可以使用 melt 函数,但我无法让它在那种情况下工作。
非常感谢,
您可以在多索引列上使用 stack
。
In [304]: df.columns = df.columns.str.split('_', expand=True)
In [305]: df.stack(0).reset_index(1)
Out[305]:
level_1 var1 var2
2014-01-01 A 1.0 0.0
2014-01-01 B 0.0 0.0
2014-01-02 A 0.0 1.0
2014-01-02 B 0.0 0.0
2014-01-03 A 0.0 0.0
2014-01-03 B 1.0 0.0
2014-01-04 A 0.0 0.0
2014-01-04 B 0.0 1.0
一个选项是 pivot_longer function from pyjanitor,使用 .value
占位符:
# pip install pyjanitor
import pandas as pd
import janitor
df.pivot_longer(names_to=("type", ".value"),
names_sep="_",
ignore_index=False,
sort_by_appearance = True)
type var1 var2
2014-01-01 A 1.0 0.0
2014-01-01 B 0.0 0.0
2014-01-02 A 0.0 1.0
2014-01-02 B 0.0 0.0
2014-01-03 A 0.0 0.0
2014-01-03 B 1.0 0.0
2014-01-04 A 0.0 0.0
2014-01-04 B 0.0 1.0
.value
将与其关联的列的一部分保留为 header,而其余部分进入 type
列。