我有一个这样的数据框
ID, DateIndex, Qty
1, 1, 10
2, 1, 15
3, 1, 20
4, 1, 30
1, 2, 14
2, 2, 13
3, 2, 14
4, 2, 12
1, 3, 1
2, 3, 60
3, 3, 19
4, 3, 12
....
我要输出这样的表
ID, DateIndex, Qty, n-1, n-2, n-3, n-4....
1, 3, 1, -1, -1, 0, 0....
2, 3, 60, 1, 1, 0, 0....
3, 3, 19, 1, -1, 0, 0....
4, 3, 12, 0, -1, 0, 0....
条件是,如果该dateindex的数量值小于该ID在dateindex-1处的数量值,它将返回-1,如果大于它的值将返回1,并且等于或等于找不到,它将返回0。
这是我到目前为止所拥有的
import pandas
import numpy as np
df = pandas.read_csv('test.csv', parse_dates=['Date']).sort_values(['Date', 'ID'])
df['DateIndex'] = df['Date'].rank(method='dense')
我认为我需要定义一个函数并使用apply,但不确定如何做
答案 0 :(得分:2)
它只是library(tidyverse)
set.seed(7)
# make data
df <- data.frame(region=c(1:5),matrix(sample(c(rep(NA,7),1:10),30,T),ncol=6))
# name the columns
names(df)[2:7] <- paste0('X',c(2012:2017))
# G. Grothendieck's function but unlist x and use dplyr's first() and last() functions
lastMinusFirst <- function(x, y = unlist(x)) last(na.omit(x)) - first(na.omit(x))
df %>%
mutate(Diff = pmap_int(select(., starts_with("X")), # select columns, use pmap to list their contents
.f = lift_vd(lastMinusFirst))) # lift_vd around the function to allow ... argument
,每组呼叫 region X2012 X2013 X2014 X2015 X2016 X2017 Diff
1 1 3 NA 1 4 4 NA 1
2 2 NA 1 8 NA 1 6 5
3 3 NA 8 NA NA 10 2 -6
4 4 8 1 9 NA 7 1 -7
5 5 1 5 NA NA NA 6 5
。但是,您的输出表明您想将groupby
与diff
组进行比较,并将每个组分配给单独的列。因此,您需要使用不同的值多次调用n
:
n-1, n-2, n-3....
此函数返回一个序列。在列表理解内将其命名为diff
,以创建系列列表。最后,def shift_count(x, i):
m = x.groupby('ID').Qty.diff(i)
return (m.gt(0).astype(int) - m.lt(0).astype(int)).rename('n-'+str(i))
与原始n
pd.concat