对分组数据进行排序和分析

Sort and analyse grouped data

我想开始进行一些数据分析。 基本上我有 2 列 'number' 和 'date' 并且都重复出现了几次。我想对我的数据编号进行排序,然后为每个编号组对 'date' 数据进行排序。

最后,我想创建另一个列 'dif',它给出了一组中第一个 'date' 与集群中彼此 'date' 的区别。

但是它没有像我预期的那样工作,我该如何实现它?

这是我目前得到的结果,排序适用于 'number' 列。

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 尝试了两列,但没有成功。

使用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