2017-10-26 22 views
-1

いくつかのデータ分析を開始したいと思います。 基本的には、2つの列 '番号'と '日付'があり、両方が数回現れます。私は自分のデータ番号をソートしたいのですが、その後、各番号グループについて、「日付」データをソートします。グループ化されたデータを並べ替えて分析する

最後に、グループの最初の「日付」とクラスタ内の「日付」の違いを示す別の列「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) 

これは、「日付」がソートされておらず、「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

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

あなたは(それが現在timedelta列です)整数の列としてdiff列をしたい場合は、.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 
+0

素晴らしい感謝です。あなたの2番目のコードを追加すると、2つのエラーが発生します:TypeError:タイプのオブジェクトを変換できません。 pandas.core.series.Series '>をdatetimikeのインデックスに、AttributeError:datetimikeの値で.dtアクセサーを使用することができます。大変感謝します:) –

+0

@MaximilianLöffel最後の行の結果を戻す必要があります。 'df = df.assign(diff = df.groupby( 'number')['date'] \ .apply(ラムダx:x - x.values [0]))それを試しましたか?それがうまくいくならば、投票し、答えを受け入れることを忘れないでください。ありがとう。 –

関連する問題