【问题标题】:Joining 4 Pandas data frames & setting 2 index columns加入 4 个 Pandas 数据框并设置 2 个索引列
【发布时间】:2020-02-29 19:33:52
【问题描述】:

如果这个问题似乎是重复的,请原谅我,但我找不到符合我确切要求的过去问题。

我有一个名为“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

我有另一个数据框,称为“区域”,如下所示:

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的数据改变{insert number}吗,例如只有最后一行?您只需要一列吗?
  • 两个 DataFrame 中的行数相同 - dfregions?
  • 正在用实际值编辑最后一帧,以便明确问题
  • 超级,你也可以指定追加regions的逻辑,特别是dfregionsDataFrame中有不同的行

标签: python pandas join concat


【解决方案1】:

计算数据帧pct_1pct_2pct_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())

【讨论】:

    猜你喜欢
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2019-12-09
    • 1970-01-01
    • 2021-08-23
    • 2013-10-16
    • 2021-12-31
    相关资源
    最近更新 更多