在pandas中添加一列,该列是连续行之间差异的结果

89

假设我有一个像这样的数据框

    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

我在dataframe/series上看到了一个叫做diff的东西,但它的作用有些不同,因为第一个元素会变成NaN。

4个回答

155

使用 shift 函数。

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

1
你能对第一/最后一行中的“NaN”做些什么呢? - André Fernandes
1
@AndréFernandes 你想在那里放什么?你总是可以在之后使用 fillna,但如果你正在向下移动,第一行的合理值是什么? - exp1orer
好的,只需在结果上使用 fillna。例如 df['dA'].fillna(0) - exp1orer
我收到了SettingWithCopyWarning警告: 正在尝试在DataFrame的切片副本上设置值。 请尝试使用.loc [row_indexer,col_indexer] = value。 - Parthiban Rajendran
1
@PaariVendhan 这是pandas中非常常见的问题,与你在其他地方定义数据框的方式有关。这与shift方法无关。这是一篇非常长的文章 https://www.dataquest.io/blog/settingwithcopywarning/ 和一个更短的stackoverflow答案,可能会有所帮助 https://dev59.com/8WIj5IYBdhLWcg3wHhlX - exp1orer
显示剩余5条评论

51
你可以使用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]

1
当'A'仅包含列表元素而不是标量时,我该如何处理相同的问题? - LNRD.CLL
2
@LeoCella 你可以通过不允许它们在列表中来管理它们。 - cs95
被接受的答案很有趣,但我认为这是更好的答案。 - Marius

3

在使用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 

1
滚动差异也可以通过以下方式计算:
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,Value4-Value3等操作。 - Seth Okeyo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接