首页 > 解决方案 > Python:为数据框中的每一列获取对数差异

问题描述

我有一个数据框列表,并且想为这些数据框中的每个元素记录日志并找到第一个区别。在时间序列计量经济学中,这个过程给出了一个近似的增长率。以下代码

for i in [0, 1, 2, 5]:
    df1_list[i] = 100 * np.log(df_list[i]).diff() 

给出一个错误

__main__:7: RuntimeWarning: divide by zero encountered in log
__main__:7: RuntimeWarning: invalid value encountered in log

当我查看结果时,结果数据框的许多元素都是 nan。如何修复代码?谢谢 !!

标签: pythonlogarithm

解决方案


一些测试数据

df = pd.DataFrame(np.random.rand(5, 5))
df = df.mask(np.random.random(df.shape) < .1)
          0         1         2         3         4
0  0.579643  0.614592  0.333945  0.241791  0.426162
1  0.576076  0.841264  0.235148  0.577707  0.278260
2  0.735097  0.594789  0.640693  0.913639  0.620021
3  0.015446       NaN  0.062203  0.253076  0.042025
4  0.401775  0.522634  0.521139  0.032310       NaN

应用您的代码

for c in df:
    print(100 * np.log(df[c]).diff())

产生这样的输出(对于c = 1):

0          NaN
1    31.394708
2   -34.670002
3          NaN
4          NaN

你可以nans删除.dropna()

for c in df:
    print(100 * np.log(df[c].dropna()).diff())

产生(对于c = 1

0          NaN
1    31.394708
2   -34.670002
4   -12.932474

如您所见,我们因此“丢失”了一行,.dropna()而您的第 0 行将始终如此nan,因为没有区别。

如果您有兴趣用其他值替换nans ,可以使用不同的技术,例如fillnaimputation


推荐阅读