1. ホーム
  2. python

[解決済み] 3D Pandas DataFrameの構築

2022-03-02 20:50:57

質問

Pandasで3D DataFrameを構築するのに苦労しています。次のようなものが欲しい

A               B               C
start    end    start    end    start    end ...
7        20     42       52     90       101
11       21                     213      34
56       74                     9        45
45       12

ここで A , B などはトップレベルの記述子であり startend はサブデスクリプターです。後に続く数字はペアで、同じ数のペアは A , B などです。を観察してください。 A には、このようなペアが4つあります。 B は1つだけ、そして C は3つあります。

このDataFrameを構築する際に、どのように進めていけばいいのかがわからない。修正方法 これ の例では、設計通りの出力は得られませんでした。

import numpy as np
import pandas as pd

A = np.array(['one', 'one', 'two', 'two', 'three', 'three'])
B = np.array(['start', 'end']*3)
C = [np.random.randint(10, 99, 6)]*6
df = pd.DataFrame(zip(A, B, C), columns=['A', 'B', 'C'])
df.set_index(['A', 'B'], inplace=True)
df

が降参した。

                C
 A          B   
 one        start   [22, 19, 16, 20, 63, 54]
              end   [22, 19, 16, 20, 63, 54]
 two        start   [22, 19, 16, 20, 63, 54]
              end   [22, 19, 16, 20, 63, 54]
 three      start   [22, 19, 16, 20, 63, 54]
              end   [22, 19, 16, 20, 63, 54]

Cのリストをそれぞれの列に分割する方法はないのでしょうか?

EDIT: 私の C が重要です。以下のような感じです。

 C = [[7,11,56,45], [20,21,74,12], [42], [52], [90,213,9], [101, 34, 45]]

そして、目的の出力は一番上にあるものです。これは、あるシーケンス内の部分配列の始点と終点を表しています ( A , B . C は異なる配列)。配列そのものによって、私が探している条件を満たす部分配列の数は異なる。その結果、以下のように開始と終了のペアの数が異なる。 A , B など

解決方法は?

まず、欠損値を表すためにCを埋める必要があると思います

In [341]: max_len = max(len(sublist) for sublist in C)
In [344]: for sublist in C:
     ...:     sublist.extend([np.nan] * (max_len - len(sublist)))

In [345]: C
Out[345]: 
[[7, 11, 56, 45],
 [20, 21, 74, 12],
 [42, nan, nan, nan],
 [52, nan, nan, nan],
 [90, 213, 9, nan],
 [101, 34, 45, nan]]

そして、numpyの配列に変換し、転置して、列と一緒にDataFrameのコンストラクタに渡します。

In [288]: C = np.array(C)
In [289]: df = pd.DataFrame(data=C.T, columns=pd.MultiIndex.from_tuples(zip(A,B)))

In [349]: df
Out[349]: 
     one         two       three     
   start  end  start  end  start  end
0      7   20     42   52     90  101
1     11   21    NaN  NaN    213   34
2     56   74    NaN  NaN      9   45
3     45   12    NaN  NaN    NaN  NaN