に列を追加するために適用します。私はレベル1でグループ化し、新しい列を生成する関数を適用したい。私は、この計算されたカラムは、各グループに追加したいので、私のデータフレームは、グループごとに新しい列を持っています。GROUPBYを使用し、私は列として、多指数を有するデータフレームを有する各グループ
私は私が何をしたいレプリケートするために少しダミースクリプト機能を作りました。次のように
import pandas as pd
import numpy as np
columns = [('A','julian'),('A','geoffrey'),
('B','julian'),('B','geoffrey'),
('C','julian'),('C','geoffrey')]
columns = pd.MultiIndex.from_tuples(columns)
dataframe = pd.DataFrame(data=np.random.rand(10,6),columns=columns)
def addColumn(inputDF):
group = inputDF.columns[0][1]
inputDF['sum', group] = inputDF.sum(axis=1)
return inputDF
newColumnsDataframe = dataframe.groupby(level=1, axis=1).apply(addColumn)
元データフレームが見えます:
A B C
julian geoffrey julian geoffrey julian geoffrey
0 0.204082 0.073676 0.795725 0.279702 0.258185 0.258112
1 0.263235 0.096733 0.507324 0.541198 0.525919 0.757652
2 0.196243 0.028613 0.653408 0.364365 0.174911 0.924733
3 0.528785 0.831569 0.654160 0.738029 0.940831 0.294473
4 0.853517 0.263250 0.803087 0.855270 0.701937 0.264698
5 0.239797 0.069519 0.943544 0.374411 0.189361 0.846647
6 0.980734 0.290414 0.850097 0.873785 0.903645 0.118713
7 0.591942 0.088387 0.566298 0.062140 0.568482 0.872064
8 0.818167 0.061483 0.282050 0.008404 0.449198 0.658370
9 0.217424 0.427602 0.471933 0.171458 0.390549 0.234426
次のように結果のデータフレームは、(私が別途加算データフレームを構築し、この結果を達成するために2つのデータフレームを連結)になります。
A B C sum A B C \
geoffrey geoffrey geoffrey geoffrey julian julian julian
0 0.073676 0.279702 0.258112 0.611491 0.204082 0.795725 0.258185
1 0.096733 0.541198 0.757652 1.395584 0.263235 0.507324 0.525919
2 0.028613 0.364365 0.924733 1.317710 0.196243 0.653408 0.174911
3 0.831569 0.738029 0.294473 1.864071 0.528785 0.654160 0.940831
4 0.263250 0.855270 0.264698 1.383219 0.853517 0.803087 0.701937
5 0.069519 0.374411 0.846647 1.290578 0.239797 0.943544 0.189361
6 0.290414 0.873785 0.118713 1.282912 0.980734 0.850097 0.903645
7 0.088387 0.062140 0.872064 1.022590 0.591942 0.566298 0.568482
8 0.061483 0.008404 0.658370 0.728257 0.818167 0.282050 0.449198
9 0.427602 0.171458 0.234426 0.833486 0.217424 0.471933 0.390549
sum
julian
0 1.257992
1 1.296478
2 1.024561
3 2.123776
4 2.358542
5 1.372703
6 2.734476
7 1.726721
8 1.549415
9 1.079906
を
上記のスクリプトでのアプローチは、私には理にかなっているものに基づいており、どのような他の人はこの種のものをやって、オンラインで書かれています。しかし、newColumnsDataframeは依然としてわずか6列を有していない8(一つがそれぞれの名前のために添加)。
level = 0(A、B、またはC)でグループ化してtransformを使用すると、newColumnsDataframeには9つの列と1つの合計列が追加されています各グループごとに以下のコードを参照してください:
import pandas as pd
import numpy as np
columns = [('A','julian'),('A','geoffrey'),
('B','julian'),('B','geoffrey'),
('C','julian'),('C','geoffrey')]
columns = pd.MultiIndex.from_tuples(columns)
dataframe = pd.DataFrame(data=np.random.rand(10,6),columns=columns)
def addColumn(inputDF):
group = inputDF.columns[0][1]
inputDF[group, 'sum'] = inputDF.sum(axis=1)
return inputDF
newColumnsDataframe = dataframe.groupby(level=0, axis=1).transform(addColumn)
それは一方で、全体データフレームとしてグループで運営適用するには、常にグループ内の各列に取り組ん変換私の理解でした。これは矛盾しているようです。 私も、私はレベル= 1でグループおよび適用の代わりにトランスフォームを使用するときに、気づいた、それは次のようなエラーがスローされます。
ValueError: Length mismatch: Expected axis has 10 elements, new values have 6 elements
私は何が起こっているかについて非常に混乱しています。誰もがレベル= 0でtransformとgroupを使うとき、なぜこれがうまくいくのか知っていますか?なぜ私はレベル= 1で同じグループを行うときにエラーがあります。そして、なぜEITHERレベルでグループ化関数を適用することは、私の最後のデータフレームに列を追加しないのですか?前もって感謝します!
(PS:これは、実際のデータフレームまたは関数Iが列を追加するために使用しています、だけで簡単にイラストではありません):
(df.join(pd.concat({'sum': df.groupby(level=1, axis=1).sum()}, axis=1))
.sortlevel(level=1, axis=1))
が生成する厄介なの
希望の出力を追加できますか? – roadrunner66
それは繰り返す。あなたの最終的な結果は何ですか?興味深い質問、良いロードマップが、宛先はありません。 – Parfait
元のデータフレームと目的の結果を追加しました。私はこれが助けて欲しい! – jjvandermade