2016-10-04 4 views
2

を返す私は2つの列のデータフレームを有する:ts(タイムスタンプ)とn(番号)パンダは、予想外の結果

タイムスタンプを2016-07-15で開始:今

In [1]: d.head() 
Out[1]: 
         ts n 
0 2016-07-15 00:04:09.444 12 
1 2016-07-15 00:05:01.633 12 
2 2016-07-15 00:05:03.173 31 
3 2016-07-15 00:05:03.970 12 
4 2016-07-15 00:05:04.258 23 

、Iは、ピボット:

pd.pivot_table(d, columns='n', values='ts', aggfunc=lambda x: (np.min(x) - pd.Timestamp('2016-07-15')).days) 

整数の列が日を表していますが、代わりに次の文字が表示されます。

n 
12 1970-01-01 
23 1970-01-01 
31 1970-01-01 
Name: ts, dtype: datetime64[ns] 

ここには何が欠けていますか?そして達成するためのより良い方法があり、同じあなたがgroupby必要

答えて

1

IIUCとapplyでカスタム関数を追加します(表内のnの最初の出現のための日のオフセットを取得しようとしている):

print (d.groupby('n')['ts'].apply(lambda x: (x.min() - pd.Timestamp('2016-07-15')).days)) 
n 
12 0 
23 0 
31 0 
Name: ts, dtype: int64 

あなたのコードでは0も得られますが、dtypetsdatetimeの前に値がdatetime1970-01-01)に変換されます。

私はその後intdatetimeをキャスト必要がありますが、最初のvaluesによってnumpy arrayに変換思う:

s = pd.pivot_table(d, columns='n', 
         values='ts', 
         aggfunc=lambda x: (np.min(x) - pd.Timestamp('2016-07-15')).days) 
s = s.values.astype(int) 
print (s) 
n 
12 0 
23 0 
31 0 
Name: ts, dtype: int64 
+0

感謝!! groupbyはピボットするためのより良い選択肢のようです! – bluephoton

関連する問題