4

列に識別子のいくつかのコンポーネントがあり、別の列に識別子に関連付けられた値がある DataFrame があります。各列が識別パラメーターになるように n 列を作成できるようにしたいと考えています。

            foo    Type      ID     Index    Value  
25090        x       A        0       0     23272000
25090        x       A        0       0     23272000
25091        x       A        1       0     22896000
25092        x       B        0       1     20048000
25093        y       A        0       0     19760000
25092        y       B        0       1     20823342

Type_ID_Indexグループ化のn列(groupbyで取得できます)があり、各列にそれぞれの値があるようにしたいと思います。値を foo に関連付けたい。

すなわち

           foo          A_0_0     A_1_0     B_0_1      
25090        x         23272000  22896000  20048000
25090        x         23272000  22896000  20048000
25091        x         23272000  22896000  20048000
25092        x         23272000  22896000  20048000
25093        y         19760000  21568000  20823342
25092        y         19760000  21568000  20823342

どうすればこれを達成できますか?

4

1 に答える 1

3

サンプルデータから始めます

In [3]: df
Out[3]: 
      foo  bar Type  ID  Index     Value

25090   x    9    A   0      0  23272000
25090   x    5    A   0      0  23272000
25091   x    3    A   1      0  22896000
25092   x    3    B   0      1  20048000
25093   y    6    A   0      0  19760000
25092   y    4    B   0      1  20823342

行ごとに適用して、各行の識別子を連結しjoinます。

In [4]: identifier = df[['Type', 'ID', 'Index']].apply(
             lambda x: '_'.join(map(str, x)), axis=1)

Value 列から Series を作成し、識別子と foo でインデックスを付けます。

In [5]: v = df['Value']

In [6]: v.index = pd.MultiIndex.from_arrays([df['foo'], identifier])

In [7]: v
Out[7]: 
foo       
x    A_0_0    23272000
     A_0_0    23272000
     A_1_0    22896000
     B_0_1    20048000
y    A_0_0    19760000
     B_0_1    20823342
Name: Value, dtype: int64

スタックを解除し、'foo' で元の DataFrame に結合します。

In [8]: df[['foo', 'bar']].join(v.drop_duplicates().unstack(), on='foo')
Out[8]: 
      foo  bar     A_0_0     A_1_0     B_0_1

25090   x    9  23272000  22896000  20048000
25090   x    5  23272000  22896000  20048000
25091   x    3  23272000  22896000  20048000
25092   x    3  23272000  22896000  20048000
25093   y    6  19760000       NaN  20823342
25092   y    4  19760000       NaN  20823342

スタックを解除する前に、重複をドロップしたことに注意してくださいv。これは不可欠です。データセット内のどこかに同じ識別子に対して異なる値がある場合、問題が発生します。

重要な点: 出力例には、入力例にない行 (25094) があります。また、私の出力の NaN は理にかなっています。foo='y' の場合、A_1_0 によって値が指定されません。

于 2013-04-16T03:49:54.553 に答える