次のデータフレームがある場合、グループAには4つのサンプル、B 3のサンプル、C 1のサンプルがあります。
group data_1 data_2
0 A 1 4
1 A 2 5
2 A 3 6
3 A 4 7
4 B 1 4
5 B 2 5
6 B 3 6
7 C 1 4
データをnumpy配列に変換したいと思います。各行は、すべてのサンプルを持つグループであり、サンプルが少ないグループのゼロパディングです。
次のような配列になります:
[
[[1,4],[2,5],[3,6],[4,7]], # this is A group 4 samples
[[1,4],[2,5],[3,6],[0,0]], # this is B group 3 samples
[[1,4],[0,0],[0,0],[0,0]], # this is C group 1 sample
]
最初に欠落している値を追加する必要があります- unstack
および stack
を使用した最初のソリューション、カウンターシリーズは cumcount
。
2番目のソリューションは reindex
by MultiIndex
を使用します。
最後にgroupby
でラムダ関数を使用し、 values
でnumpy配列に変換し、最後にリストに:
g = df.groupby('group').cumcount()
L = (df.set_index(['group',g])
.unstack(fill_value=0)
.stack().groupby(level=0)
.apply(lambda x: x.values.tolist())
.tolist())
print (L)
[[[1, 4], [2, 5], [3, 6], [4, 7]],
[[1, 4], [2, 5], [3, 6], [0, 0]],
[[1, 4], [0, 0], [0, 0], [0, 0]]]
別の解決策:
g = df.groupby('group').cumcount()
mux = pd.MultiIndex.from_product([df['group'].unique(), g.unique()])
L = (df.set_index(['group',g])
.reindex(mux, fill_value=0)
.groupby(level=0)['data_1','data_2']
.apply(lambda x: x.values.tolist())
.tolist()
)