排序和分析分组数据

时间:2017-10-26 17:03:36

标签: python pandas pandas-groupby

我想开始进行一些数据分析。 基本上我有两列“数字”和“日期”,两次都重新出现。我想对数据编号进行排序,然后为每个数字组排序“日期”数据。

最后,我想创建另一个列'dif',这样我就可以看到群组中第一个'日期'与群集中每个'日期'的区别。

但它没有按照我的预期运作,我该如何实现呢?

这是我到目前为止所做的,排序适用于'数字'列。

import pandas as pd
import numpy as np

df=pd.ExcelFile('result.xlsx')
df=df.parse(0)
df=df.sort_values(['number'], ascending=True)   #sorting
df = df.reset_index(drop=True)  #index reset
number=df['number']     #creating number and date
date=df['date']
df['dif']=''
rowcount=len(df.index)  #create rowcounting as maximum index

print('rowcount:', rowcount) #17 rows, start with 0 up to 16
print(df)   #data is sorted and need to be analzsed

def applyFunc(i):
    if number[i] == number [i+1]:
        if date[i+1]>date[i]: 
             return date[i+1]-date[i]
        else:
             return date[i]-date[i+1]

df['dif']=df.apply(applyFunc)

这是我的数据框数据,没有对'date'进行排序,并且在'dif'列中没有任何内容。

    rowcount: 17
    number       date dif
0     1624 2017-01-06    
1     1624 2017-01-07    
2     1633 2017-01-05    
3     1633 2017-01-08    
4     1633 2017-01-14    
5     1716 2017-01-02    
6     1716 2017-01-04    
7     1716 2017-01-04    
8     1716 2017-01-09    
9     2165 2017-01-10    
10    2323 2017-01-07    
11    4564 2017-01-13    
12    4564 2017-01-11    
13    4568 2017-01-12    
14    6565 2017-01-05    
15    6565 2017-01-06    
16    6565 2017-01-09   

P.S。我尝试使用groupby和sort_values作为两个列,但没有让它工作。

1 个答案:

答案 0 :(得分:1)

使用sort_values + groupby + apply

df = df.sort_values(['number', 'date'])   
df.assign(diff=df.groupby('number')['date']\
               .apply(lambda x: x - x.values[0]))

    number       date   diff
0     1624 2017-01-06 0 days
1     1624 2017-01-07 1 days
2     1633 2017-01-05 0 days
3     1633 2017-01-08 3 days
4     1633 2017-01-14 9 days
5     1716 2017-01-02 0 days
6     1716 2017-01-04 2 days
7     1716 2017-01-04 2 days
8     1716 2017-01-09 7 days
9     2165 2017-01-10 0 days
10    2323 2017-01-07 0 days
12    4564 2017-01-11 0 days
11    4564 2017-01-13 2 days
13    4568 2017-01-12 0 days
14    6565 2017-01-05 0 days
15    6565 2017-01-06 1 days
16    6565 2017-01-09 4 days

如果您希望diff列作为整数列(它当前是timedelta列),请访问.dt.days属性。

df['diff'] = df['diff'].dt.days
df

    number       date  diff
0     1624 2017-01-06     0
1     1624 2017-01-07     1
2     1633 2017-01-05     0
3     1633 2017-01-08     3
4     1633 2017-01-14     9
5     1716 2017-01-02     0
6     1716 2017-01-04     2
7     1716 2017-01-04     2
8     1716 2017-01-09     7
9     2165 2017-01-10     0
10    2323 2017-01-07     0
12    4564 2017-01-11     0
11    4564 2017-01-13     2
13    4568 2017-01-12     0
14    6565 2017-01-05     0
15    6565 2017-01-06     1
16    6565 2017-01-09     4