複数の行で記述された「オブジェクト」(テーブル内のいくつかの行でそれぞれ表されます)があります。しかし、問題は、オブジェクトが行を見逃すことがあるということです。私の目標は、各オブジェクトが同じ量の行(同じ形状)を持ち、オブジェクトの欠落している行が空の行で埋められるDataFrameを作成することです。
例えば:
オブジェクト1
O-ID | key 1 | key 2 | ... | key N | value 1 | value 2 | value N
0 | A 11 | A 21 | ... | key N1 | | |
0 | A 13 | A 23 | ... | key N3 | | |
0 | A 16 | A 26 | ... | key N6 | | |
オブジェクト2
O-ID | key 1 | key 2 | ... | key N | value 1 | value 2 | value N
1 | A 12 | A 22 | ... | key N2 | | |
1 | A 13 | A 23 | ... | key N3 | | |
1 | A 14 | A 24 | ... | key N4 | | |
「O-ID」はオブジェクトIDです。全部で6種類の行があることがわかります。結局、各オブジェクトに6行すべてを持たせたいと思います。key 1 .. key-Nは、キーと値のペア(値1 ...値N)の意味でのキーです。
結果は次のようになります。
オブジェクト1:
O-ID | key 1 | key 2 | ... | key N | value 1 | value 2 | value N
0 | A 11 | A 21 | ... | key N1 | | |
0 | A 12 | A 22 | ... | key N2 | Null | Null | Null
0 | A 13 | A 23 | ... | key N3 | | |
0 | A 14 | A 24 | ... | key N4 | Null | Null | Null
0 | A 15 | A 25 | ... | key N5 | Null | Null | Null
0 | A 16 | A 26 | ... | key N6 | | |
オブジェクト2:
O-ID | key 1 | key 2 | ... | key N | value 1 | value 2 | value N
1 | A 11 | A 21 | ... | key N1 | Null | Null | Null
1 | A 12 | A 22 | ... | key N2 | | |
1 | A 13 | A 23 | ... | key N3 | | |
1 | A 14 | A 24 | ... | key N4 | | |
1 | A 15 | A 25 | ... | key N5 | Null | Null | Null
1 | A 16 | A 26 | ... | key N6 | Null | Null | Null
遅いforループを使用する以外にこれを行う方法がわかりません...
欠落している行を見つけるためのより良い/より速い方法と、「Null」行を挿入する方法を知っていますか?
「O-ID」でグループ化して、グループの地図を使うというアイデアはもうありました。しかし、「null」行を正しい順序ですばやく挿入するにはどうすればよいですか?
私は最新のパンダバージョンと最新のPython3を使用しています
まず、作成マルチインデックスを、我々は結果データフレームに必要なすべてのキーからres
。その後、我々は、インデックスを再作成、この新しいマルチインデックスと私たちのデータフレームを。最後のステップでは、キータプルを個々の列に変換し直し、列を並べ替えて、必要に応じて行を並べ替えます。
import pandas as pd
df = pd.DataFrame( {'O_ID': [0,0,0,1,1,1,2],
'key_1': ['A11', 'A13', 'A16', 'A12', 'A13', 'A14', 'A15'],
'key_2': ['A21', 'A23', 'A26', 'A22', 'A23', 'A24', 'A25'],
'key_n': ['key N1', 'key N3', 'key N6', 'key N2', 'key N3', 'key N4', 'key N5'],
'value_1': [11,12,13,14,15,16,17],
'value_2': [21,22,23,24,25,26,27],
'value_n': [121,122,123,124,125,126,127]
})
keycols = [c for c in df.columns if c.startswith('key')]
valcols = [c for c in df.columns if c.startswith('value')]
# create multiindex of all combinations of O_ID and key tuples
keys = df[keycols].apply(tuple, axis=1)
idx = pd.MultiIndex.from_product([df.O_ID.unique(), keys.unique()], names=['O_ID','key_tuples'])
# set index of O_ID and key tuples and reindex with new multiindex
res = df.set_index(['O_ID',keys]).drop(columns=keycols)
res = res.reindex(idx).reset_index()
# split key tuples back into individual columns and reorder/sort as needed
res = pd.DataFrame(res.key_tuples.to_list(), index=res.index, columns=keycols).join(res).drop(columns=['key_tuples'])
res = res.reindex(columns=['O_ID']+keycols+valcols).sort_values(['O_ID']+keycols)
結果:
O_ID key_1 key_2 key_n value_1 value_2 value_n
0 0 A11 A21 key N1 11.0 21.0 121.0
3 0 A12 A22 key N2 NaN NaN NaN
1 0 A13 A23 key N3 12.0 22.0 122.0
4 0 A14 A24 key N4 NaN NaN NaN
5 0 A15 A25 key N5 NaN NaN NaN
2 0 A16 A26 key N6 13.0 23.0 123.0
6 1 A11 A21 key N1 NaN NaN NaN
9 1 A12 A22 key N2 14.0 24.0 124.0
7 1 A13 A23 key N3 15.0 25.0 125.0
10 1 A14 A24 key N4 16.0 26.0 126.0
11 1 A15 A25 key N5 NaN NaN NaN
8 1 A16 A26 key N6 NaN NaN NaN
12 2 A11 A21 key N1 NaN NaN NaN
15 2 A12 A22 key N2 NaN NaN NaN
13 2 A13 A23 key N3 NaN NaN NaN
16 2 A14 A24 key N4 NaN NaN NaN
17 2 A15 A25 key N5 17.0 27.0 127.0
14 2 A16 A26 key N6 NaN NaN NaN
(キーA15の3番目のオブジェクトを追加する必要がありました。そうしないと、サンプルデータからこのキーの出所がわかりません。つまり、このメソッドは既存のすべてのキーを使用します。すべてのキー値を事前に知っていて、結果を作成したい場合これらのキーを持つデータフレームは、入力データフレームで発生するかどうかに関係なく、入力データに存在する一意のキーの代わりに、これらの既知のキー値からマルチインデックスを作成できます)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加