如何将列添加到pandas中的数据框

时间:2016-01-28 17:35:32

标签: python pandas

假设你有dataframe df

 ID     data 
1  1234    123     
2  1234    213     
3  1234    432   
4  1234    32     
5  1234    54     
6  5678    67     

您想要添加一个名为'计算'的新列。返回一个功能: data [1] -data [0] / data [0](因为我们需要来自前一个单元格的数据,计算的第一个单元格将为0)

我们如何添加此列,我们如何编写此函数,该函数接收的数据不在存储数据的同一行?

2 个答案:

答案 0 :(得分:2)

你只能找到相对差异,然后归咎于0:

import pandas as pd

df = pd.DataFrame({
    'data': range(5)
})

df['calc'] = (df.data.shift(1) - df.data) / df.data
df.calc.values[0] = 0

>>> df
    data    calc
0   0   0
1   1   -1.000000
2   2   -0.500000
3   3   -0.333333
4   4   -0.250000

5 rows × 2 columns

答案 1 :(得分:1)

如果你提到的话,你会使用diff。例如:

import pandas as pd

df = pd.DataFrame({'data':[123, 312, 432, 32, 54, 67]})
df['new'] = df['data'].diff() / df['data']

哪个收益率:

   data        new
0   123        NaN
1   312   0.605769
2   432   0.277778
3    32 -12.500000
4    54   0.407407
5    67   0.194030

一般来说,这些类型的东西都是矢量化技巧。移位和切片非常有用。例如,说我们想要

(data[i] + data[i+1]) / data[i]

如果你熟悉numpy数组,你可能会尝试:

df['new'] = (df['data'][:-1] + df['data'][1:]) / df['data']

由于pandas处理自动对齐的方式,此结果与前一个结果略有不同:

   data  new
0   123  NaN
1   312    2
2   432    2
3    32    2
4    54    2
5    67  NaN

因此,对于pandas,最好明确移动序列而不是使用切片,在这种情况下:

df['new'] = (df['data'].shift(1) + df['data']) / df['data'].astype(float)

这会产生:

   data        new
0   123        NaN
1   312   1.394231
2   432   1.722222
3    32  14.500000
4    54   1.592593
5    67   1.805970