根据列值执行pandas中行之间的差异

时间:2015-10-08 19:26:12

标签: python python-2.7 pandas

我有这个数据框,我试图创建一个新列,我想根据代码和日期存储销售产品的差异。 例如,这是起始数据帧:

      date     code sold
0   20150521    0   47
1   20150521    12  39
2   20150521    16  39
3   20150521    20  38
4   20150521    24  38
5   20150521    28  37
6   20150521    32  36
7   20150521    4   43
8   20150521    8   43
9   20150522    0   47
10  20150522    12  37
11  20150522    16  36
12  20150522    20  36
13  20150522    24  36
14  20150522    28  35
15  20150522    32  31
16  20150522    4   42
17  20150522    8   41
18  20150523    0   50
19  20150523    12  48
20  20150523    16  46
21  20150523    20  46
22  20150523    24  46
23  20150523    28  45
24  20150523    32  42
25  20150523    4   49
26  20150523    8   49
27  20150524    0   39
28  20150524    12  33
29  20150524    16  30
... ... ... ...
150 20150606    32  22
151 20150606    4   34
152 20150606    8   33
153 20150607    0   31
154 20150607    12  30
155 20150607    16  30
156 20150607    20  29
157 20150607    24  28
158 20150607    28  26
159 20150607    32  24
160 20150607    4   30
161 20150607    8   30
162 20150608    0   47

我认为这可能是一个解决方案......

  full_df1=full_df[full_df.date == '20150609'].reset_index(drop=True)
    full_df1['code'] = full_df1['code'].astype(float)
    full_df1= full_df1.sort(['code'], ascending=[False])

    code date      sold
8   32  20150609    33  
7   28  20150609    36  
6   24  20150609    37  
5   20  20150609    39  
4   16  20150609    42  
3   12  20150609    46  
2   8   20150609    49  
1   4   20150609    49  
0   0   20150609    50  





  full_df1.set_index('code')['sold'].diff().reset_index()   

这使我得到了一个日期20150609的输出:

    code difference
0   32  NaN
1   28  3
2   24  1
3   20  2
4   16  3
5   12  4
6   8   3
7   4   0
8   0   1

是否有更好的解决方案以更加pythonic的方式获得相同的结果? 我想创建一个新的列[差异]并存储数据,结果有4列[日期,代码,销售,差异]

1 个答案:

答案 0 :(得分:1)

这正是panda的groupby功能所构建的内容,我强烈建议您阅读并使用此文档:panda's groupby documentation

此代码会复制您要求的内容,但会复制每个日期。

df = pd.DataFrame({'date':['Mon','Mon','Mon','Tue','Tue','Tue'],'code':[10,21,30,10,21,30], 'sold':[12,13,34,10,15,20]})
df['difference'] = df.groupby('date')['sold'].diff()

df

    code    date    sold    difference
0   10      Mon     12      NaN
1   21      Mon     13      1
2   30      Mon     34      21
3   10      Tue     10      NaN
4   21      Tue     15      5
5   30      Tue     20      5