添加一列,这是熊猫中连续行差异的结果
Posted
技术标签:
【中文标题】添加一列,这是熊猫中连续行差异的结果【英文标题】:Adding a column thats result of difference in consecutive rows in pandas 【发布时间】:2014-06-02 07:19:00 【问题描述】:假设我有一个这样的数据框
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。
【问题讨论】:
【参考方案1】:使用shift。
df['dA'] = df['A'] - df['A'].shift(-1)
【讨论】:
如果 'A' 包含列表元素怎么办? 只要该操作对数据框中的任何值都有意义,它就可以工作!例如,如果 DataFrame 中的每个“单元格”都是一个列表,则可以执行df['A'] + df['A'].shift()
,但不能减去,因为没有为列表定义减法。
你能对第一行/最后一行的“NaN”做什么?
@AndréFernandes 你想在那里做什么?之后你总是可以做一个fillna
,但如果你向下移动,第一行的合理值是多少?
@PaariVendhan 这是 pandas 的一个非常常见的问题,与您在其他地方定义数据框的方式有关。它与shift
方法无关。这是一篇很长的文章 dataquest.io/blog/settingwithcopywarning 和一个较短的 *** 答案,可能会有所帮助 ***.com/questions/20625582/…【参考方案2】:
您可以使用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 您可以通过不允许它们出现在列表中来管理它们。 接受的答案很有趣,但我认为这是更好的答案【参考方案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
【讨论】:
【参考方案4】:滚动差异也可以这样计算:
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) 中两个连续值之间的差异并将该值存储在不同的列(新列)。例如,滚动差异,您有一个名为 ['Profit'] 的列,要获得用于计算边际收入的差异,您将执行 value2 - value1, value3- Value2, Value 4 - Value 3.... 等跨度>以上是关于添加一列,这是熊猫中连续行差异的结果的主要内容,如果未能解决你的问题,请参考以下文章