2

dataframe私はそのような列を持つパンダを持っています:

event_id、obj_0_type、obj_0_foo、obj_0_bar、obj_1_type、obj_1_foo、obj_1_bar、obj_n_type、obj_n_foo、obj_n_bar、....

例えば:

col_idx = ['event_id']
[col_idx.extend(('obj_%d_id' %d, 'obj_%d_foo' %d, 'obj_%d_bar' %d)) for d in range(5)]
event_id = np.array(range(0,5))
data = np.random.rand(15,5)
data = np.vstack((event_id, data))
df = DataFrame(data.T, index = range(5), columns = col_idx)

オブジェクトごとに単一のエントリを持つように、データフレームの個々の行を分割したいと思います。

event_id、obj_type、obj_foo、obj_bar

event_id は、特定のイベントのすべてのオブジェクト間で共有されます。

それを行うには非常に遅い方法がたくさんあります(データフレーム行を反復して新しいシリーズオブジェクトを作成する)が、それらは非常に遅く、明らかにPythonicではありません。私が見逃している簡単な方法はありますか?

4

1 に答える 1

2

freenode の #pydata で何人かの人々からいくつかの提案を受けて、これが私が思いついたものです:

data = []
for d in range(5):
    temp = df.ix[:, ['event_id', 'obj_%d_id' % d, 'obj_%d_foo' % d, 'obj_%d_bar' % d]]
    temp.columns = ['event_id', 'obj_id', 'obj_foo', 'obj_bar']
    # Giving columns unique names.
    temp.index = temp['event_id']*10 + d
    # Creating a unique index.
    data.append(temp)

concat(data)

これは機能し、かなり高速です。

于 2012-08-04T13:54:05.810 に答える