假设你有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)
我们如何添加此列,我们如何编写此函数,该函数接收的数据不在存储数据的同一行?
答案 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