首页 > 解决方案 > 计算多个熊猫数据帧的百分比变化

问题描述

假设我有两个不同的 pandas 数据帧,它们具有完全相同的结构:

df1

+---+---------+------+------+------+
|   | summary | col1 | col2 | col3 |
+---+---------+------+------+------+
| 0 | count   | 10   | 10   | 10   |
+---+---------+------+------+------+
| 1 | mean    | 4    | 5    | 5    |
+---+---------+------+------+------+
| 2 | stddev  | 3    | 3    | 3    |
+---+---------+------+------+------+
| 3 | min     | 0    | -1   | 5    |
+---+---------+------+------+------+
| 4 | max     | 100  | 56   | 47   |
+---+---------+------+------+------+

df2

+---+---------+------+------+------+
|   | summary | col1 | col2 | col3 |
+---+---------+------+------+------+
| 0 | count   | 15   | 15   | 5    |
+---+---------+------+------+------+
| 1 | mean    | 2    | 2.5  | 2.5  |
+---+---------+------+------+------+
| 2 | stddev  | 3    | 3    | 3    |
+---+---------+------+------+------+
| 3 | min     | 0    | -1   | 5    |
+---+---------+------+------+------+
| 4 | max     | 50   | 56   | 47   |
+---+---------+------+------+------+

对于每个条目,我想计算两个数据框的值之间的百分比变化。我知道有一个功能pct_change(),但是这只适用于同一个熊猫数据框。所需的输出是

+---+---------+------+------+------+
|   | summary | col1 | col2 | col3 |
+---+---------+------+------+------+
| 0 | count   | 50%  | 50%  | -50% |
+---+---------+------+------+------+
| 1 | mean    | -50% | -50% | -50% |
+---+---------+------+------+------+
| 2 | stddev  | 0%   | 0%   | 0%   |
+---+---------+------+------+------+
| 3 | min     | 0%   | 0%   | 0%   |
+---+---------+------+------+------+
| 4 | max     | -50% | 0%   | 0%   |
+---+---------+------+------+------+

.

标签: pythonpandasdataframe

解决方案


按字符串列创建索引,将 DataFrames 除以DataFrame.div、减去、1乘以:DataFrame.subDataFrame.mul

df = df2.set_index('summary').div(df1.set_index('summary')).sub(1).mul(100).reset_index()
print (df)
  summary  col1  col2  col3
0   count  50.0  50.0 -50.0
1    mean -50.0 -50.0 -50.0
2  stddev   0.0   0.0   0.0
3     min   NaN   0.0   0.0
4     max -50.0   0.0   0.0

编辑:

如果需要pct_change在列表中的 DataFrames 之间,df1 与 df2,df2 与 df3 ...:

L = [df1, df2]
df = (pd.concat(L, keys=range(len(L)))
        .set_index('summary', append=True)
        .groupby(level=1)
        .pct_change())

print (df)
             col1  col2  col3
    summary                  
0 0 count     NaN   NaN   NaN
  1 mean      NaN   NaN   NaN
  2 stddev    NaN   NaN   NaN
  3 min       NaN   NaN   NaN
  4 max       NaN   NaN   NaN
1 0 count     0.5   0.5  -0.5
  1 mean     -0.5  -0.5  -0.5
  2 stddev    0.0   0.0   0.0
  3 min       NaN   0.0   0.0
  4 max      -0.5   0.0   0.0

推荐阅读