添加一列多数民众赞成在熊猫连续行差异的结果


69

可以说我有一个这样的数据框

    A   B
0   a   b
1   c   d
2   e   f 
3   g   h

0、1、2、3是时间,a,c,e,g是一个时间序列,而b,d,f,h是另一个时间序列。我需要能够向原始数据帧添加两列,这是通过计算某些列的连续行的差异而获得的。

所以我需要这样的东西

    A   B   dA
0   a   b  (a-c)
1   c   d  (c-e)
2   e   f  (e-g)
3   g   h   Nan

我在数据框/系列上看到了一个叫做diff的东西,但是它做的略有不同,因为第一个元素将变为Nan。

Answers:


124

使用shift

df['dA'] = df['A'] - df['A'].shift(-1)

如果“ A”包含列表元素怎么办?
LeoCella

只要该操作对您数据框中的任何值有意义,它就起作用!例如,如果DataFrame中的每个“单元格”都是一个列表,则可以执行df['A'] + df['A'].shift(),但不能进行减法,因为没有为列表定义减法。
exp1orer

您如何处理第一行/最后一行中的“ NaN”?
安德烈·费尔南德斯

1
@AndréFernandes您想在那里吗?您总是可以进行fillna事后处理,但是如果您要调低班次,那么第一行的合理值是什么?
exp1orer

1
@PaariVendhan这是熊猫很常见的问题,与您在其他地方定义数据框的方式有关。与shift方法无关。这是一篇很长的文章dataquest.io/blog/settingwithcopywarning和一个较短的stackoverflow答案,可能对stackoverflow.com/questions/20625582/
。– exp1orer

39

您可以使用diff和传递-1作为periods参数:

>>> df = pd.DataFrame({"A": [9, 4, 2, 1], "B": [12, 7, 5, 4]})
>>> df["dA"] = df["A"].diff(-1)
>>> df
   A   B  dA
0  9  12   5
1  4   7   2
2  2   5   1
3  1   4 NaN

[4 rows x 3 columns]

当'A'仅具有列表元素而不是标量时,我该如何解决相同的问题?
LeoCella

1
@LeoCella您可以通过不允许它们出现在列表中来对其进行管理。
cs95

公认的答案很有趣,但是我认为这是一个更好的答案
Marius19年

2

当以CSV格式使用数据时,这将完美工作:

my_data = pd.read_csv('sale_data.csv')
df = pd.DataFrame(my_data)
df['New_column'] = df['target_column'].diff(1)
print(df) #for the console but not necessary 

0

滚动差异也可以通过以下方式计算:

df=pd.DataFrame(my_data)
my_data = pd.read_csv('sales_data.csv')
i=0
j=1
while j < len(df['Target_column']):
    j=df['Target_column'][i+1] - df['Target_column'][i] #the difference btwn two values in a column.
    i+=1 #move to the next value in the column.
    j+=1 #next value in the new column.
    print(j)

例如,这是当您要计算CSV列中的滚动差异时,例如,您要获取列中两个连续值之间的差异(Target_column)并将该值存储在另一列中(New_column)。例如,滚动差异,您有一个名为['Profit']的列,要获​​取用于计算边际收入的差异,您将执行value2-value1,value3- Value2,Value 4-Value 3...。等等
塞思Okeyo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.