1. ホーム
  2. python

[解決済み] 既存のデータフレームに計算されたカラムを添付する

2022-02-12 23:53:51

質問

Pandasを学び始めているのですが、以下のような質問がありました。 こちら と提案された解決策を実行することができず、indexingエラーが発生しました。私が持っているのは次のようなものです。

from pandas import *
import pandas as pd
d = {'L1' : Series(['X','X','Z','X','Z','Y','Z','Y','Y',]),
     'L2' : Series([1,2,1,3,2,1,3,2,3]),
     'L3' : Series([50,100,15,200,10,1,20,10,100])}
df = DataFrame(d)  
df.groupby('L1', as_index=False).apply(lambda x : pd.expanding_sum(x.sort('L3', ascending=False)['L3'])/x['L3'].sum())

と出力されます (iPythonを使っています)。

L1   
X   3    0.571429
    1    0.857143
    0    1.000000
Y   8    0.900901
    7    0.990991
    5    1.000000
Z   6    0.444444
    2    0.777778
    4    1.000000
dtype: float64

そして、投稿にあるように、"new"というラベルの下に累積数の計算を追記しようとします。

df["new"] = df.groupby("L1", as_index=False).apply(lambda x : pd.expanding_sum(x.sort("L3", ascending=False)["L3"])/x["L3"].sum())

これが分かるんです。

   2196                         value = value.reindex(self.index).values
   2197                     except:
-> 2198                         raise TypeError('incompatible index of inserted column '
   2199                                         'with frame index')
   2200 
TypeError: incompatible index of inserted column with frame index

何が問題なのか、誰か知っていますか?どうすれば計算された値をデータフレームに再挿入して、値を順番に表示することができますか(各ラベルX、Y、Zに対して"new"で降順)。

解決方法は?

問題は、エラーメッセージにあるように、挿入したい計算カラムのインデックスと df .

のインデックスは df は単純なインデックスです。

In [8]: df.index
Out[8]: Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8], dtype='int64')

計算されたカラムのインデックスが MultiIndex であるのに対し (すでに出力で確認できます)、このカラムを new_column :

In [15]: new_column.index
Out[15]: 
MultiIndex
[(u'X', 3), (u'X', 1), (u'X', 0), (u'Y', 8), (u'Y', 7), (u'Y', 5), (u'Z', 6), (u'Z', 2), (u'Z', 4)]

このため、フレームに挿入することはできません。ただし これは0.12でのバグです これは0.13(リンク先の質問の回答がテストされたもの)では動作するので、キーワード as_index=False はカラム L1 はインデックスに追加されません。

0.12での解決方法 :
MultiIndexの第1レベルを削除して、元のインデックスを取り戻します。

In [13]: new_column = df.groupby('L1', as_index=False).apply(lambda x : pd.expanding_sum(x.sort('L3', ascending=False)['L3'])/x['L3'].sum())
In [14]: df["new"] = new_column.reset_index(level=0, drop=True)


pandas 0.13(開発中)では、これは修正されています( https://github.com/pydata/pandas/pull/4670 ). このため as_index=False はgroupbyの呼び出しで使用されるので、カラムの L1 (そのため、元のインデックスが保持され、結果を元のフレームに追加することができます。しかし、どうやら as_index を使用する場合、0.12ではこのキーワードは無視されます。 apply .