2016-12-05 7 views
1

私のデータフレームのサンプルは次の形式です。Pythonのパンダのクラスファクタの列のレベルの最大値と最小値

**place** **time** 
delhi  11/5/2015 
delhi  17/5/2015 
chennai  13/4/2015 
kolkata  21/3/2015 
chennai  29/6/2014 
bhopal  17/4/2015 
delhi  16/4/2015 
kolkata  23/6/2014 
chennai  11/6/2015 
punjab  7/7/2014 
chennai  9/11/2015 
delhi  13/12/2015 
delhi  6/7/2014 
kolkata  25/4/2015 
bhopal  11/3/2015 
punjab  19/6/2015 
bhopal  21/5/2015 

カラムの場所はファクタ形式です(時刻の列はクラス文字です)。

ここで、ユニークな場所ごとに、最大で&の最小日付が報告されています。その後、私は同じ時間の継続時間(時間の違い)を見つけるのが好きです、私は最大の日付から最小の日付を引いてそれを行うでしょう。

私の目的は、以下のようなデータフレームを作成することです。

**place** **time**  **min_date** **max_date** **duration(in minute)** 
delhi  11/5/2015  6/7/2014  13/12/2015 max_date-min_date 
delhi  17/5/2015  6/7/2014  13/12/2015 max_date-min_date 
chennai  13/4/2015  13/4/2015  9/11/2015  max_date-min_date 
kolkata  21/3/2015  23/6/2014  25/4/2015  max_date-min_date 
chennai  29/6/2014  13/4/2015  9/11/2015  max_date-min_date 
bhopal  17/4/2015  11/3/2015  21/5/2015  max_date-min_date 
delhi  16/4/2015  6/7/2014  13/12/2015 max_date-min_date 
kolkata  23/6/2014  23/6/2014  25/4/2015  max_date-min_date 
chennai  11/6/2015  13/4/2015  9/11/2015  max_date-min_date 
punjab  7/7/2014  7/7/2014  19/6/2015  max_date-min_date 
chennai  9/11/2015  13/4/2015  9/11/2015  max_date-min_date 
delhi  13/12/2015  6/7/2014  13/12/2015 max_date-min_date 
delhi  6/7/2014  6/7/2014  13/12/2015 max_date-min_date 
kolkata  25/4/2015  23/6/2014  25/4/2015  max_date-min_date 
bhopal  11/3/2015  11/3/2015  21/5/2015  max_date-min_date 
punjab  19/6/2015  7/7/2014  19/6/2015  max_date-min_date 
bhopal  21/5/2015  11/3/2015  21/5/2015  max_date-min_date 

私はpython3 &パンダを使用しています。私のデータフレームにdfという名前がついていて、次に最小値を見つけるために&という最大の日付があるとわかります.df.time.min()& df.time.max()を書かなければなりません。

私を案内してもらえますか?いつものように、事前に感謝します。

あなたがfirt minutesため 60によって total_secondsと最後の分裂によって secondsTimedeltaを変換し、 to_datetime**time**transformと、その後 groupbysubによって最後GETT差を変換することができ
+0

あなたの試みのコードは、少なくとも追加することができますか? –

+0

パンダを使って私は上記の2つの列を思いついた。しかし、私が望むフォーマットでデータを生成しようとしたコードは動作していません。だから私はこれを投稿した。 –

答えて

1

df['**time**'] = pd.to_datetime(df['**time**'], dayfirst=True) 
g = df.groupby('**place**')['**time**'] 
df['**min_date**'] = g.transform('min') 
df['**max_date**'] = g.transform('max') 
df[' **duration(in minute)**'] = df['**max_date**'].sub(df['**min_date**']) 
                .dt.total_seconds() 
                .div(60) 
print (df) 
    **place** **time** **min_date** **max_date** **duration(in minute)** 
0  delhi 2015-05-11 2014-07-06 2015-12-13     756000.0 
1  delhi 2015-05-17 2014-07-06 2015-12-13     756000.0 
2 chennai 2015-04-13 2014-06-29 2015-11-09     717120.0 
3 kolkata 2015-03-21 2014-06-23 2015-04-25     440640.0 
4 chennai 2014-06-29 2014-06-29 2015-11-09     717120.0 
5  bhopal 2015-04-17 2015-03-11 2015-05-21     102240.0 
6  delhi 2015-04-16 2014-07-06 2015-12-13     756000.0 
7 kolkata 2014-06-23 2014-06-23 2015-04-25     440640.0 
8 chennai 2015-06-11 2014-06-29 2015-11-09     717120.0 
9  punjab 2014-07-07 2014-07-07 2015-06-19     499680.0 
10 chennai 2015-11-09 2014-06-29 2015-11-09     717120.0 
11  delhi 2015-12-13 2014-07-06 2015-12-13     756000.0 
12  delhi 2014-07-06 2014-07-06 2015-12-13     756000.0 
13 kolkata 2015-04-25 2014-06-23 2015-04-25     440640.0 
14 bhopal 2015-03-11 2015-03-11 2015-05-21     102240.0 
15 punjab 2015-06-19 2014-07-07 2015-06-19     499680.0 
16 bhopal 2015-05-21 2015-03-11 2015-05-21     102240.0 

dayと同様の形式が必要な場合最初の使用dt.strftime

df['**time**'] = df['**time**'].dt.strftime('%d/%m/%Y') 
df['**min_date**']= df['**min_date**'].dt.strftime('%d/%m/%Y') 
df['**max_date**']= df['**max_date**'].dt.strftime('%d/%m/%Y') 
print (df) 
    **place** **time** **min_date** **max_date** **duration(in minute)** 
0  delhi 11/05/2015 06/07/2014 13/12/2015     756000.0 
1  delhi 17/05/2015 06/07/2014 13/12/2015     756000.0 
2 chennai 13/04/2015 29/06/2014 09/11/2015     717120.0 
3 kolkata 21/03/2015 23/06/2014 25/04/2015     440640.0 
4 chennai 29/06/2014 29/06/2014 09/11/2015     717120.0 
5  bhopal 17/04/2015 11/03/2015 21/05/2015     102240.0 
6  delhi 16/04/2015 06/07/2014 13/12/2015     756000.0 
7 kolkata 23/06/2014 23/06/2014 25/04/2015     440640.0 
8 chennai 11/06/2015 29/06/2014 09/11/2015     717120.0 
9  punjab 07/07/2014 07/07/2014 19/06/2015     499680.0 
10 chennai 09/11/2015 29/06/2014 09/11/2015     717120.0 
11  delhi 13/12/2015 06/07/2014 13/12/2015     756000.0 
12  delhi 06/07/2014 06/07/2014 13/12/2015     756000.0 
13 kolkata 25/04/2015 23/06/2014 25/04/2015     440640.0 
14 bhopal 11/03/2015 11/03/2015 21/05/2015     102240.0 
15 punjab 19/06/2015 07/07/2014 19/06/2015     499680.0 
16 bhopal 21/05/2015 11/03/2015 21/05/2015     102240.0 
なし

ソリューションはmapを使用し、最初の集計minmaxです:

df['**time**'] = pd.to_datetime(df['**time**'], dayfirst=True) 
g = df.groupby('**place**')['**time**'] 

min_ser = g.min() 
print (min_ser) 
**place** 
bhopal 2015-03-11 
chennai 2014-06-29 
delhi  2014-07-06 
kolkata 2014-06-23 
punjab 2014-07-07 
Name: **time**, dtype: datetime64[ns] 

max_ser = g.max() 
print (max_ser) 
**place** 
bhopal 2015-05-21 
chennai 2015-11-09 
delhi  2015-12-13 
kolkata 2015-04-25 
punjab 2015-06-19 
Name: **time**, dtype: datetime64[ns] 

df['**min_date**'] = df['**place**'].map(min_ser) 
df['**max_date**'] = df['**place**'].map(max_ser) 
print (df) 
    **place** **time** **min_date** **max_date** 
0  delhi 2015-05-11 2014-07-06 2015-12-13 
1  delhi 2015-05-17 2014-07-06 2015-12-13 
2 chennai 2015-04-13 2014-06-29 2015-11-09 
3 kolkata 2015-03-21 2014-06-23 2015-04-25 
4 chennai 2014-06-29 2014-06-29 2015-11-09 
5  bhopal 2015-04-17 2015-03-11 2015-05-21 
6  delhi 2015-04-16 2014-07-06 2015-12-13 
7 kolkata 2014-06-23 2014-06-23 2015-04-25 
8 chennai 2015-06-11 2014-06-29 2015-11-09 
9  punjab 2014-07-07 2014-07-07 2015-06-19 
10 chennai 2015-11-09 2014-06-29 2015-11-09 
11  delhi 2015-12-13 2014-07-06 2015-12-13 
12  delhi 2014-07-06 2014-07-06 2015-12-13 
13 kolkata 2015-04-25 2014-06-23 2015-04-25 
14 bhopal 2015-03-11 2015-03-11 2015-05-21 
15 punjab 2015-06-19 2014-07-07 2015-06-19 
16 bhopal 2015-05-21 2015-03-11 2015-05-21 
+0

oops、関数 'to_datetime'に' dayfirst = True'を追加する必要があります。これは正しい出力です。 – jezrael

+0

それは素晴らしいです.. –

+0

@jazrael、私はpyspark 2.0.1&DataFrameベースのAPIを使用している場合、変換機能は動作しません。どうすればそれを進めることができますか? df ['** min_date **'] = g.transform( 'min') df ['** max_date **'] = g.transform( 'max') これらの2行はpysparkで同様の結果が得られますか? –

関連する問題