对一组列使用“应用”时的边界条件问题

2024-06-02 11:16:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧df

|            | Country     |    Pop1   |      Pop2 |  … |  Popn    |
|:-----------|------------:|:---------:|:---------:|:--:|:--------:|
| 0          |      Canada |     0     |     2     |  … |     50   |
| 1          |      China  |     0     |     5     |  … |     75   |
| 2          |     Croatia |     0     |     1     |  … |     30   |

对于Pop1到Popn列,我想从当前列中减去前面的列值。所以我这样做了:

df_copy = df.copy()
df_copy[df_copy.columns[2:]] = df_copy[df_copy.columns[2:]].apply(lambda x: x - x.shift(1), axis=1)

但是,我遇到了以下问题:我的第一列是Nan,因为之前没有值

|            | Country     |    Pop1   |      Pop2 |  … |  Popn    |
|:-----------|------------:|:---------:|:---------:|:--:|:--------:|
| 0          |      Canada |     Nan   |     2     |  … |     6    |
| 1          |      China  |     Nan   |     5     |  … |     10   |
| 2          |     Croatia |     Nan   |     1     |  … |     2    |

为了解决这个问题,我决定创建一个新的dataframe,它是将原始dataframe的第一列和第二列以及减法结果中的其他列连接在一起的结果

df_new = pd.concat([df[df.columns[:2]], df_copy[df_copy.columns[2:]]], axis=1)

我想这不是最好的方法,是吗?是否有一种方法可以直接在apply函数中获得所需的结果(指定边界条件等)


Tags: columns方法dataframedfnancountryapplycopy
1条回答
网友
1楼 · 发布于 2024-06-02 11:16:31

我认为您可以通过^{}转换非差异列,然后使用^{},通过^{}重新封装NaN的列,最后通过^{}将索引转换为列:

df1 = df.set_index('Country')
df1 = df1.diff(1, axis=1).fillna(df1).reset_index()
print (df1)
   Country  Pop1  Pop2  Popn
0   Canada   0.0   2.0  48.0
1    China   0.0   5.0  70.0
2  Croatia   0.0   1.0  29.0

相关问题 更多 >