入力パンダデータフレームのサンプルを次に示します。
**LastUpdate** **Whatever** ...
2017-12-30 xxx ...
2017-12-30 yyy ...
2017-12-30 zzz ...
2018-01-01 yyy ...
2018-01-03 zzz ...
予想されるDF(出力)は次のとおりです。
**LastUpdate** **Whatever** ...
2017-12-30 xxx ...
2017-12-30 yyy ...
2017-12-30 zzz ...
2017-12-31 xxx ...
2017-12-31 yyy ...
2017-12-31 zzz ...
2018-01-01 yyy ...
2018-01-02 yyy ...
2018-01-03 zzz ...
ご覧のとおり、データの欠落している日は単に前日の行を複製するため、欠落している日を(すべての)前日のデータで埋めるだけです。1日あたりの行数が異なる可能性があるため、実際には役に立ちません。
重要な注意:2日間で1日以上欠落している可能性があります(2018-01-01から2018-01-05になる可能性があるため、これら2日間の欠落しているすべての日を同じデータで追加する必要があります( 2018-01-01とまったく同じ行数/コンテンツ)で、データが利用可能な最終日です。
私はいくつかの調査を行い、resample、ffill、reset_indexメソッドを考え出しましたが、一意の日付インデックスが必要なため、特定のケースに適合しないようです。これは、1日に複数の行がある可能性があるため、ここでは当てはまりません。関連付けられています。
私がこれまでに試したこと:
df['Last Update'] = pd.to_datetime(df['Last Update'])
df.set_index("Last Update", inplace=True)
dfResult = df.resample('D').ffill().reset_index()
これは得られますcannot reindex a non-unique index with a method or limit
(そしてそれは完全に理にかなっています)が、私がやろうとしていることを達成する方法を本当に理解することはできません。不明な点がある場合、または追加情報が必要な場合は、サポートをお願いします。
# This solution should also work for multiple columns.
# Setup.
df['Whatever2'] = df['Whatever'].map({'xxx':'a', 'yyy':'b', 'zzz':'c'})
df
LastUpdate Whatever Whatever2
0 2017-12-30 xxx a
1 2017-12-30 yyy b
2 2017-12-30 zzz c
3 2018-01-01 yyy b
4 2018-01-05 zzz c
5 2018-01-06 xxx a
6 2018-01-06 xxx a
7 2018-01-09 yyy b
使用set_index
+ unstack
、その後、reindex
そしてstack
再び。
# If required, convert "LastUpdate" to `datetime`.
# df['LastUpdate'] = pd.to_datetime(df['LastUpdate'], errors='coerce')
(df.set_index(['LastUpdate', df.groupby('LastUpdate').cumcount()])
.unstack(1, fill_value='')
.reindex(pd.date_range(df['LastUpdate'].min(), df['LastUpdate'].max()))
.ffill()
.replace('', np.nan)
.stack(1)
.reset_index(level=1, drop=True)
.rename_axis('LastUpdate').reset_index())
LastUpdate Whatever Whatever2
0 2017-12-30 xxx a
1 2017-12-30 yyy b
2 2017-12-30 zzz c
3 2017-12-31 xxx a
4 2017-12-31 yyy b
5 2017-12-31 zzz c
6 2018-01-01 yyy b
7 2018-01-02 yyy b
8 2018-01-03 yyy b
9 2018-01-04 yyy b
10 2018-01-05 zzz c
11 2018-01-06 xxx a
12 2018-01-06 xxx a
13 2018-01-07 xxx a
14 2018-01-07 xxx a
15 2018-01-08 xxx a
16 2018-01-08 xxx a
17 2018-01-09 yyy b
まず、インデックスを設定します。cumcount
繰り返し日付の数を取得するために使用します。これは、新しい日付を何回繰り返す必要があるかを決定するために必要です。
df.groupby('LastUpdate').cumcount().to_numpy()
# array([0, 1, 2, 0, 0, 0, 1, 0])
df.set_index(['LastUpdate', df.groupby('LastUpdate').cumcount()])
Whatever Whatever2
LastUpdate
2017-12-30 0 xxx a
1 yyy b
2 zzz c
2018-01-01 0 yyy b
2018-01-05 0 zzz c
2018-01-06 0 xxx a
1 xxx a
2018-01-09 0 yyy b
次に、を使用しますunstack
。私はを使用しfill_value=''
て、次のステップ(フォワードフィル)のブロックとして機能します。
_.unstack(1, fill_value='')
Whatever Whatever2
0 1 2 0 1 2
LastUpdate
2017-12-30 xxx yyy zzz a b c
2018-01-01 yyy b
2018-01-05 zzz c
2018-01-06 xxx xxx a a
2018-01-09 yyy b
reindex
不足している日付を含めるために使用できるようになりました。
_.reindex(pd.date_range(df['LastUpdate'].min(), df['LastUpdate'].max()))
Whatever Whatever2
0 1 2 0 1 2
2017-12-30 xxx yyy zzz a b c
2017-12-31 NaN NaN NaN NaN NaN NaN
2018-01-01 yyy b
2018-01-02 NaN NaN NaN NaN NaN NaN
2018-01-03 NaN NaN NaN NaN NaN NaN
2018-01-04 NaN NaN NaN NaN NaN NaN
2018-01-05 zzz c
2018-01-06 xxx xxx a a
2018-01-07 NaN NaN NaN NaN NaN NaN
2018-01-08 NaN NaN NaN NaN NaN NaN
2018-01-09 yyy b
ここで、フォワードフィルを使用して、昨日のi番目のデータを欠落している日付の対応する位置に割り当てます。
_.ffill()
Whatever Whatever2
0 1 2 0 1 2
2017-12-30 xxx yyy zzz a b c
2017-12-31 xxx yyy zzz a b c
2018-01-01 yyy b
2018-01-02 yyy b
2018-01-03 yyy b
2018-01-04 yyy b
2018-01-05 zzz c
2018-01-06 xxx xxx a a
2018-01-07 xxx xxx a a
2018-01-08 xxx xxx a a
2018-01-09 yyy b
フィラー値をNaN、およびに置き換えますstack
。
_.replace('', np.nan).stack(1)
Whatever Whatever2
2017-12-30 0 xxx a
1 yyy b
2 zzz c
2017-12-31 0 xxx a
1 yyy b
2 zzz c
2018-01-01 0 yyy b
2018-01-02 0 yyy b
2018-01-03 0 yyy b
2018-01-04 0 yyy b
2018-01-05 0 zzz c
2018-01-06 0 xxx a
1 xxx a
2018-01-07 0 xxx a
1 xxx a
2018-01-08 0 xxx a
1 xxx a
2018-01-09 0 yyy b
その後、インデックスをクリーンアップします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加