带循环的条件列

时间:2019-08-09 21:29:27

标签: python pandas dataframe conditional-statements

我有一个这样的数据框

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,但不确定如何做

1 个答案:

答案 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 。但是,您的输出表明您想将groupbydiff组进行比较,并将每个组分配给单独的列。因此,您需要使用不同的值多次调用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