对分组数据进行排序和分析
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
我想开始进行一些数据分析。 基本上我有 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