加入 4 Pandas 个数据框并设置 2 个索引列
Joining 4 Pandas data frames & setting 2 index columns
如果这个问题看起来重复,请原谅我,但我找不到符合我确切要求的过去的问题。
我有一个名为 "df" 的数据框,它有一个日期时间索引,如下所示:
X1 X2 X3 X4
date
1/1/2000 10 4 1 6
1/2/2000 9 8 7 2
1/3/2000 7 10 5 3
1/4/2000 10 6 2 7
我从数据框中生成了 1、2 和 3 天后变量百分比变化的 3 个数据框:
pct_1 = df.pct_change(1)
pct_2 = df.pct_change(2)
pct_3 = df.pct_change(3)
框架 "pct_1" 看起来像这样:
X1 X2 X3 X4
date
1/1/2000 NaN NaN NaN NaN
1/2/2000 -0.10 1.00 6.00 -0.67
1/3/2000 -0.22 0.25 -0.29 0.50
1/4/2000 0.43 -0.40 -0.60 1.33
框架 "pct_2" 看起来像这样:
X1 X2 X3 X4
date
1/1/2000 NaN NaN NaN NaN
1/2/2000 NaN NaN NaN NaN
1/3/2000 -0.30 1.50 4.00 -0.50
1/4/2000 0.11 -0.25 -0.71 2.50
框架 "pct_3" 看起来像这样:
X1 X2 X3 X4
date
1/1/2000 NaN NaN NaN NaN
1/2/2000 NaN NaN NaN NaN
1/3/2000 NaN NaN NaN NaN
1/4/2000 0.0 0.5 1.0 0.166667
我有另一个数据框,叫做 "regions",看起来像这样:
Region Priority
X1 1
X2 2
X3 3
X4 1
我的最终目标是制作如下所示的内容:
pct_1 pct_2 pct_3 priority
date region
1/1/2000 X1 NaN NaN NaN 1
1/2/2000 X2 1.00 NaN NaN 2
1/3/2000 X3 -0.29 4.00 NaN 3
1/4/2000 X4 1.33 2.50 0.17 1
有没有人知道如何做到这一点?我对逻辑或任何事情一无所知。我只知道我想要最终产品是什么样子。
计算数据帧 pct_1
、pct_2
、pct_3
很简单,但在加入它们时,您必须重新格式化数据。查看 Pandas-Reshaping
假设 Region
列具有唯一值。
str1 = r'''
date X1 X2 X3 X4
1/1/2000 10 4 1 6
1/2/2000 9 8 7 2
1/3/2000 7 10 5 3
1/4/2000 10 6 2 7'''
str2=r'''
Region Priority
X1 1
X2 2
X3 3
X4 1
'''
reg = pd.read_table(io.StringIO(str2), sep='\s+')
# Read data
df = pd.read_table(io.StringIO(str1), sep='\s+', index_col=0)
# Compute the percent change and stack the Region column
pct = pd.concat([df.pct_change(i) for i in range(1,4)], axis=1, keys=['p1', 'p2', 'p3'])
pct = pct.stack()
pct.index = pct.index.set_names(['date', 'Region'])
pct = pct.reset_index()
# Reformatting
pct = pd.merge(pct, reg, on='Region')
pct = pct.set_index(['date', 'Region'])
print(pct.to_string())
如果这个问题看起来重复,请原谅我,但我找不到符合我确切要求的过去的问题。
我有一个名为 "df" 的数据框,它有一个日期时间索引,如下所示:
X1 X2 X3 X4
date
1/1/2000 10 4 1 6
1/2/2000 9 8 7 2
1/3/2000 7 10 5 3
1/4/2000 10 6 2 7
我从数据框中生成了 1、2 和 3 天后变量百分比变化的 3 个数据框:
pct_1 = df.pct_change(1)
pct_2 = df.pct_change(2)
pct_3 = df.pct_change(3)
框架 "pct_1" 看起来像这样:
X1 X2 X3 X4
date
1/1/2000 NaN NaN NaN NaN
1/2/2000 -0.10 1.00 6.00 -0.67
1/3/2000 -0.22 0.25 -0.29 0.50
1/4/2000 0.43 -0.40 -0.60 1.33
框架 "pct_2" 看起来像这样:
X1 X2 X3 X4
date
1/1/2000 NaN NaN NaN NaN
1/2/2000 NaN NaN NaN NaN
1/3/2000 -0.30 1.50 4.00 -0.50
1/4/2000 0.11 -0.25 -0.71 2.50
框架 "pct_3" 看起来像这样:
X1 X2 X3 X4
date
1/1/2000 NaN NaN NaN NaN
1/2/2000 NaN NaN NaN NaN
1/3/2000 NaN NaN NaN NaN
1/4/2000 0.0 0.5 1.0 0.166667
我有另一个数据框,叫做 "regions",看起来像这样:
Region Priority
X1 1
X2 2
X3 3
X4 1
我的最终目标是制作如下所示的内容:
pct_1 pct_2 pct_3 priority
date region
1/1/2000 X1 NaN NaN NaN 1
1/2/2000 X2 1.00 NaN NaN 2
1/3/2000 X3 -0.29 4.00 NaN 3
1/4/2000 X4 1.33 2.50 0.17 1
有没有人知道如何做到这一点?我对逻辑或任何事情一无所知。我只知道我想要最终产品是什么样子。
计算数据帧 pct_1
、pct_2
、pct_3
很简单,但在加入它们时,您必须重新格式化数据。查看 Pandas-Reshaping
假设 Region
列具有唯一值。
str1 = r'''
date X1 X2 X3 X4
1/1/2000 10 4 1 6
1/2/2000 9 8 7 2
1/3/2000 7 10 5 3
1/4/2000 10 6 2 7'''
str2=r'''
Region Priority
X1 1
X2 2
X3 3
X4 1
'''
reg = pd.read_table(io.StringIO(str2), sep='\s+')
# Read data
df = pd.read_table(io.StringIO(str1), sep='\s+', index_col=0)
# Compute the percent change and stack the Region column
pct = pd.concat([df.pct_change(i) for i in range(1,4)], axis=1, keys=['p1', 'p2', 'p3'])
pct = pct.stack()
pct.index = pct.index.set_names(['date', 'Region'])
pct = pct.reset_index()
# Reformatting
pct = pd.merge(pct, reg, on='Region')
pct = pct.set_index(['date', 'Region'])
print(pct.to_string())