2016-01-28 102 views
2

假设你有一个数据帧DF如何添加列到数据帧中的大熊猫

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

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

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

回答

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这是更好的顺序明确转向,而不是使用切片,该类别中ASE:

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 
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