6

マルチインデックスとして ID とタイムスタンプを持つデータフレームがあります。データフレームのインデックスは ID とタイムスタンプで並べ替えられており、各 ID の最新のタイムスタンプを選択したいと考えています。例えば:

IDs    timestamp     value
0      2010-10-30     1
       2010-11-30     2
1      2000-01-01     300
       2007-01-01     33
       2010-01-01     400
2      2000-01-01     11

基本的に私が望む結果は

IDs    timestamp    value
0      2010-11-30   2
1      2010-01-01   400
2      2000-01-01   11

パンダでそれを行うコマンドは何ですか?

4

2 に答える 2

5

この設定を考えると:

import pandas as pd
import numpy as np
import io

content = io.BytesIO("""\
IDs    timestamp     value
0      2010-10-30     1
0      2010-11-30     2
1      2000-01-01     300
1      2007-01-01     33
1      2010-01-01     400
2      2000-01-01     11""")

df = pd.read_table(content, header=0, sep='\s+', parse_dates=[1])
df.set_index(['IDs', 'timestamp'], inplace=True)

を使用reset_indexしてgroupby

df.reset_index(['timestamp'], inplace=True)
print(df.groupby(level=0).last())

収量

              timestamp  value
IDs                           
0   2010-11-30 00:00:00      2
1   2010-01-01 00:00:00    400
2   2000-01-01 00:00:00     11

ただし、これは最善の解決策とは思えません。電話をかけずにこれを行う方法があるはずreset_indexです...


コメントで指摘したように、lastNaN 値を無視します。NaN 値をスキップしないようにするには、次のように使用できますgroupby/agg

df.reset_index(['timestamp'], inplace=True)
grouped = df.groupby(level=0)
print(grouped.agg(lambda x: x.iloc[-1]))
于 2013-10-02T20:12:31.443 に答える
4

使用することもできます

df.groupby("IDs").tail(1)

これは、レベル「ID」の各ラベルの最後の行を取得し、値を無視しませんNaN

于 2018-01-07T00:32:29.193 に答える