2

私は、調査から得られたかなり複雑なデータセットのパンダ表現を扱っています。これまでのところ、複数のインデックスを持つ 1 次元の一連の変数が、このデータを格納して操作するのに最適なようです。

各変数名は、その特定の応答を一意に識別するための「パス」で構成されています。これらのパスの長さはさまざまです。階層インデックスがどのように機能するかを誤解しているのか、それともバグに遭遇しているのかを理解しようとしています。Pandas は、短いインデックスをデータセットに結合するときに最大長まで「パディング」し、その過程で値を破棄するように見えます。

たとえば、次のテストは失敗します。

def test_dataframe_construction1(self):
    case1 = pd.Series(True, pd.MultiIndex.from_tuples([
        ('a1', 'b1', 'c1'),
        ('a2', 'b2', 'c2', 'd1', 'e1'),
        ]))
    case2 = pd.Series(True, pd.MultiIndex.from_tuples([
        ('a3', 'b3', 'c3'),
        ('a4', 'b4', 'c4', 'd2', 'e2'),
        ]))
    df = pd.DataFrame({
        'case1': case1,
        'case2': case2
    })
    logger.debug(df)
    self.assertEquals(df['case1'].loc['a1'].any(), True)

そしてこれを印刷します:

a1 b1 c1 nan nan   NaN   NaN
a2 b2 c2 d1  e1   True   NaN
a3 b3 c3 nan nan   NaN   NaN
a4 b4 c4 d2  e2    NaN  True

興味深いことに、「短い」インデックスを NaN の代わりに空の文字列でパディングすると、次のような動作が期待できます。

def test_dataframe_construction2(self):
    case1 = pd.Series(True, pd.MultiIndex.from_tuples([
        ('a1', 'b1', 'c1', '', ''),
        ('a2', 'b2', 'c2', 'd1', 'e1'),
    ]))
    case2 = pd.Series(True, pd.MultiIndex.from_tuples([
        ('a3', 'b3', 'c3', '', ''),
        ('a4', 'b4', 'c4', 'd2', 'e2'),
    ]))
    df = pd.DataFrame({
        'case1': case1,
        'case2': case2
    })
    logger.debug(df)
    self.assertEquals(df['case1'].loc['a1'].any(), True)

そしてこれを印刷します:

                case1 case2
a1 b1 c1        True   NaN
a2 b2 c2 d1 e1  True   NaN
a3 b3 c3         NaN  True
a4 b4 c4 d2 e2   NaN  True

ここで何が欠けていますか?ありがとう!

4

1 に答える 1