首页 > 解决方案 > 如何在熊猫中并排附加两个数据框列

问题描述

我有一个 df ,它包含所有数字列。我想cumprod为每一列查找并将每列结果的结果并排附加。这个怎么做。为了方便比较,我想要这个并排的结果。

例如:

我的输入df:

        col1      col2      col3
0   1.000000  1.000000  1.000000
1   0.998766  0.999490  0.998892
2   0.997779  0.999081  0.998005
3   0.996299  0.998469  0.996676
4   0.994573  0.997754  0.995126
5   0.993095  0.997140  0.993797
6   0.991125  0.996322  0.992027
7   0.989648  0.995708  0.990699
8   0.988171  0.995094  0.989372
9   0.986695  0.994480  0.988045
10  0.984729  0.993660  0.986276
11  0.983010  0.992943  0.984730

df的暨产品:

        col1      col2      col3
0   1.000000  1.000000  1.000000
1   0.998766  0.999490  0.998892
2   0.996547  0.998572  0.996899
3   0.992859  0.997043  0.993585
4   0.987471  0.994803  0.988742
5   0.980653  0.991958  0.982609
6   0.971949  0.988310  0.974775
7   0.961887  0.984069  0.965708
8   0.950509  0.979241  0.955444
9   0.937863  0.973836  0.944022
10  0.923541  0.967662  0.931066
11  0.907850  0.960833  0.916849

预期输出:

        col1      col1      col2      col2      col3      col3
0   1.000000  1.000000  1.000000  1.000000  1.000000  1.000000
1   0.998766  0.998766  0.999490  0.999490  0.998892  0.998892
2   0.997779  0.996547  0.999081  0.998572  0.998005  0.996899
3   0.996299  0.992859  0.998469  0.997043  0.996676  0.993585
4   0.994573  0.987471  0.997754  0.994803  0.995126  0.988742
5   0.993095  0.980653  0.997140  0.991958  0.993797  0.982609
6   0.991125  0.971949  0.996322  0.988310  0.992027  0.974775
7   0.989648  0.961887  0.995708  0.984069  0.990699  0.965708
8   0.988171  0.950509  0.995094  0.979241  0.989372  0.955444
9   0.986695  0.937863  0.994480  0.973836  0.988045  0.944022
10  0.984729  0.923541  0.993660  0.967662  0.986276  0.931066
11  0.983010  0.907850  0.992943  0.960833  0.984730  0.916849

注意:如果我得到cum_of_coln而不是coln在列名中更受欢迎

我使用的获取 cum_prod 的代码,

print df
print df.cumprod()

标签: pythonpandas

解决方案


计算cumprod,然后使用cytoolz和交错列标题:

from toolz import interleave

df2 = df.cumprod().add_prefix('cum_of_')
df3 = pd.concat([df, df2], axis=1)[list(interleave([df, df2]))]

或者,您可以使用sorted

df2 = df.cumprod().add_prefix('cum_of_')
df3 = pd.concat([df, df2], axis=1)
df3 = df3[sorted(df3, key=lambda x: x.split('_')[-1])]

第三种选择是在排序后改变列标题。应该相当有效率。

df3 = pd.concat([df,  df.cumprod()], axis=1).sort_index(axis=1)
c = df3.columns.values
c[1::2] = 'cum_of_' + c[1::2]
df3.columns = c

df3.head()
        col1  cum_of_col1      col2  cum_of_col2      col3  cum_of_col3
0   1.000000     1.000000  1.000000     1.000000  1.000000     1.000000
1   0.998766     0.998766  0.999490     0.999490  0.998892     0.998892
2   0.997779     0.996548  0.999081     0.998571  0.998005     0.996899
3   0.996299     0.992860  0.998469     0.997043  0.996676     0.993586
4   0.994573     0.987471  0.997754     0.994803  0.995126     0.988743

推荐阅读