私は簡単に入力としてmutliple列からのデータを使用する関数を作成することができるように、マルチインデックスを持つデータフレームがあります。パンダはGROUPBY:複数の列を構築し、効率的
df = pd.DataFrame({('ALSN','VA.M'):range(5), ('ALSN','VB.M'):np.arange(5)+2,
('ALVY','VA.M'):range(5), ('ALVY','VB.M'):np.arange(5)+20,
('ALSN', 'VP.M'):np.arange(5)-10, ('ALVY','VP.M'):np.arange(5)-30,
('ALGG', 'VP.M'):np.arange(5)/5.})
ALGG ALSN ALVY
VP.M VA.M VB.M VP.M VA.M VB.M VP.M
0 0.0 0 2 -10 0 20 -30
1 0.2 1 3 -9 1 21 -29
2 0.4 2 4 -8 2 22 -28
3 0.6 3 5 -7 3 23 -27
4 0.8 4 6 -6 4 24 -26
私は、これをフィルタリングしたいとし
df2 = g.filter(lambda z: z.name[-1] != 'G')
df2.groupby(level=0, axis=1).apply(lambda g: pd.Series(g[g.name]['VB.M']+g[g.name]['VA.M']))
ALSN ALVY
0 2 20
1 4 22
2 6 24
3 8 26
4 10 28
だから、ここまでとても良い:その後、VA.MとVB.M列、たとえば、に関数を適用します。 しかし、私が実際にやりたいことは、上記のように複数の列を入力として受け取り、複数の列を出力する関数を構築することです。たとえば、VA.MとVB.Mの列を合計し、平方根と立方根を新しい列として返します。
私は明らかに2つの異なる適用関数(合計を計算し、正方形または立方根のいずれか)でこれを行うことができましたが、中間ステップ(合計を計算)を1回だけ実行したいと思います。それは可能ですか?
さらに、出力をデータフレームに、たとえば列( 'ALSN'、 'V2')、( 'ALSN'、 'V3')で保存することができます。適用と同じくらい?または、V2列またはV3列を計算し、結果のデータフレームを取り込んで元の列にマージする必要がありますか?
が適用され、本当に複雑で使用しないようにしてください。ユーザーはこれが正しいことだと思うでしょう。あなたのソル2の方がはるかに優れています。グループに直接適用して.sum()を使用する方が良いかもしれません。(ちょっとトリッキーですが) – Jeff
@Jeff - ありがとう、試してみます。私は最初の解決策を削除します。 – jezrael
@jezrael - 提案に感謝します! 2つの質問:(1)どのバージョンのパンダ/ numpyを使用していますか?鉱山はあなたの行#2の.strに満足していません。〜lvl.str.contains( 'G'); 2)どちらのソリューションでも、合計の前に 'x ** 2'または' x ** 3'を適用しています。私がしたいのは、合計を最初に実行してから次の操作を実行することです。理想的には、合計を一度計算することは望ましくありません。(x ** 2の前に1回ではなく、x.x 3 ') – SWallace