Python 根据数据帧中的值计算增量

Python 根据数据帧中的值计算增量,python,pandas,dataframe,Python,Pandas,Dataframe,我有这个数据帧(这只是一个示例,不是真实的数据): 我想要的是计算每两个月购买的增量项目。也就是说,例如,客户“001”在2月(20日)购买的物品比1月(10日)多10件。客户'002'购买了10件物品(2月20日、1月30日)。最终的数据帧如下所示: In [3]: delta_df Out [3]: client_id delta_items_feb delta_items_mar 0 001

我有这个数据帧(这只是一个示例,不是真实的数据):

我想要的是计算每两个月购买的增量项目。也就是说,例如,客户“001”在2月(20日)购买的物品比1月(10日)多10件。客户'002'购买了10件物品(2月20日、1月30日)。最终的数据帧如下所示:

In [3]: delta_df
Out [3]:   
            client_id   delta_items_feb   delta_items_mar
        0         001                10                10
        1         002               -10                -5
        2         003                10                -5

有什么想法吗?

这里有一种方法,使用
pivot\u table
首先按客户和月份对项目计数进行分组:

1) clietn_id to  set. Set to list client_listand sorted  ['001','002','003'] .
2) month string to int Jan-1;Feb-2;Mar -3 and etc
3)  for client in client_listand:
    For every client create new list
    for line in you_date:
        When ides of clients coincide, add to the list #filter by client_id
     sorted result by month
     in the loop from data of one client generate the lines of outgoing table. 
     delta_items_mar = item[n]-item[n-1]
(我首先用
df.items=df.items.astype(int)
items
列转换为整数)

注意:在pandas的较新版本中,在创建透视表时使用
索引
/
,而不是
/

这:

  • 按客户端和日期透视数据,以显示每个客户端的项目计数
  • 确保表中的列按月份正确排序
  • 使用
    np.diff
    计算连续月份之间的差异,并使用所需的列名创建新的数据框

这是一个非常明确的问题。按客户分组并计算每个组的增量:

>>> df['deltas'] = df.groupby('client_id')\
                     .apply(lambda x: x['items'].astype(int).diff()).values

  client_id  items month  deltas
0       001     10   Jan     NaN
1       001     20   Feb      10
2       001     30   Mar      10
3       002     30   Jan     NaN
4       002     20   Feb     -10
5       002     15   Mar      -5
6       003     10   Jan     NaN
7       003     20   Feb      10
8       003     15   Mar      -5
最后,将其放到您想要删除一月专栏的表单:

>>> df.pivot(index='client_id', columns='month', values='deltas')\
      .drop('Jan', axis=1)

month       Feb  Mar
client_id       
001         10  10
002        -10  -5
003         10  -5

不花哨,但这是对我有用的

#change 'items' from string to int
## use loc to avoid "slice" warning
df.loc[:,"items"] = df["items"].map(int)

# use pivot to make columns for each unique value in "month" column
dfp = df.pivot('client_id','month','items')

# calculate delta and put in a new column 
dfp["dJF"] = dfp.Feb - dfp.Jan
给予


似乎我们找到了相同的解决方案(pivot+diff),但顺序不同;-)所以我们做了:-)我想我最初尝试了
groupby
,但没有想到如何最好地在这里使用它,所以很高兴看到您的解决方案。我在执行“df['deltas']=df.groupby('client_id').apply(lambda x:x['items'].astype(int.diff()).ValueError:value的长度与索引的长度不匹配”时遇到了这个错误。看不出原因…将
df.groupby('client_id').apply(lambda x:x['items'].astype(int.diff()).values
的输出与原始
df
进行比较,以查看导致差异的原因。它在my pandas 0.15.1上使用您的示例数据运行正常。运行
df.groupby('client_id')后,我得到一个3x3数组。应用(lambda x:x['items'].astype(int.diff())。值
和差异值。也许这就是为什么我不能将
df['delta']
分配给数组的原因?我的熊猫版本是0.14.1这很奇怪,看起来你不仅得到了值,还得到了索引?您使用的是相同的测试数据还是错误出现在新数据中?我使用的是相同的测试数据(只是检查了两次)。我得到的数组是
数组([[nan,10,10.],[nan,-10.,-5.],[nan,10.,-5.])
。该
df.groupby…
语句的期望输出是什么?
>>> df.pivot(index='client_id', columns='month', values='deltas')\
      .drop('Jan', axis=1)

month       Feb  Mar
client_id       
001         10  10
002        -10  -5
003         10  -5
#change 'items' from string to int
## use loc to avoid "slice" warning
df.loc[:,"items"] = df["items"].map(int)

# use pivot to make columns for each unique value in "month" column
dfp = df.pivot('client_id','month','items')

# calculate delta and put in a new column 
dfp["dJF"] = dfp.Feb - dfp.Jan
month     Feb Jan Mar  dJF
client_id                 
001        20  10  30   10
002        20  30  15  -10
003        20  10  15   10