我想开始进行一些数据分析。 基本上我有两列“数字”和“日期”,两次都重新出现。我想对数据编号进行排序,然后为每个数字组排序“日期”数据。
最后,我想创建另一个列'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作为两个列,但没有让它工作。
答案 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