前提・実現したいこと
pandasでDataFrameを作成しています。
既に出来上がっているDFの内容を計算して、その結果を列に追加したいのですが、方法がわからなくて困っています。
データフレーム A B a 1 1 a 2 2 a 4 4 a 3 5 b 3 1 b 2 2 b 1 4 b 4 5 : :
abc・・・のグループ内で、それぞれの行のA数値+1の行とのBの値の差を
列を作成して追加したいです。
1行目は、2-1=1を追加
2行目は、5-2=3を追加
3行目は、4以上が無いので0
試したこと
forで一行ずつ処理する方法を試してみましたが、
データ数的に時間がかかってしまった?みたいです。
一気にできる方法などありましたら、ご教授いただけますでしょうか
解決方法
df.assign(C=-df.reset_index().groupby('index').apply(lambda sdf: sdf.sort_values('順位')['得点'].diff(-1).sort_index()).to_numpy())
現在の状況 1
昨日に頂いたコードを実行しました。
ありがとうございます。
目標)
indexのグループ別に、次の順位の人との得点の差を求めたいです
結果)
順位の最大数がindex別に変わるためだと思いますが、数値がずれるようです
df.head(20) 順位 得点 201901010101 1.0 1.4 201901010101 2.0 3.5 201901010101 6.0 46.6 201901010101 7.0 56.8 201901010101 9.0 140.3 201901010101 3.0 9.7 201901010101 8.0 114.7 201901010101 5.0 26.1 201901010101 4.0 16.4 201901010102 4.0 4.3 201901010102 6.0 19.8 201901010102 5.0 13.9 201901010102 8.0 27.2 201901010102 2.0 4.1 201901010102 7.0 27.0 201901010102 1.0 2.9 201901010102 3.0 4.2 201901010103 3.0 4.5 201901010103 1.0 3.6 201901010103 7.0 14.0
実行と結果になります。
df2 = df.reset_index() df2['C'] = 0 for i in range(max(df['順位'].astype(int))): df2['shift_index'] = df2['index'].shift(-i-1) df2['shift_B'] = df2['得点'].shift(-i-1) df2['C'] = df2['C'].mask((df2['順位']==i+1) & (df2['index']==df2['shift_index']), df2['shift_B']-df2['得点']) df3 = df2.drop(['shift_index', 'shift_B'], axis=1).set_index('index') df3.head(20) 順位 得点 C index 201901010101 1.0 1.4 2.1 201901010101 2.0 3.5 53.3 201901010101 6.0 46.6 -30.2 201901010101 7.0 56.8 0.0 201901010101 9.0 140.3 0.0 201901010101 3.0 9.7 6.7 201901010101 8.0 114.7 0.0 201901010101 5.0 26.1 0.0 201901010101 4.0 16.4 0.0 201901010102 4.0 4.3 -0.2 201901010102 6.0 19.8 -15.6 201901010102 5.0 13.9 -9.7 201901010102 8.0 27.2 0.0 201901010102 2.0 4.1 -1.2 201901010102 7.0 27.0 0.0 201901010102 1.0 2.9 1.3 201901010102 3.0 4.2 0.0 201901010103 3.0 4.5 54.6 201901010103 1.0 3.6 10.4 201901010103 7.0 14.0 39.3
現在の状況 2
C列の計算結果は正しい数値が取得できました。ありがとうございます
あとは、DataFrameの構造をもとに戻す方法と、やり方が見えてきたので崩さずに追加できないか模索してみます!
df2 = df.reset_index() df2 = df2.rename(columns={'index':'group'}) temp_df = df2.set_index(['group', '順位']) new_df = temp_df.assign(C=(temp_df.rename(index=lambda s: s-1, level=1) - temp_df)).reset_index() new_df.head(20) group 順位 得点 C 0 201901010101 1.0 1.4 2.1 1 201901010101 2.0 3.5 6.2 2 201901010101 6.0 46.6 10.2 3 201901010101 7.0 56.8 57.9 4 201901010101 9.0 140.3 NaN 5 201901010101 3.0 9.7 6.7 6 201901010101 8.0 114.7 25.6 7 201901010101 5.0 26.1 20.5 8 201901010101 4.0 16.4 9.7 9 201901010102 4.0 4.3 9.6 10 201901010102 6.0 19.8 7.2 11 201901010102 5.0 13.9 5.9 12 201901010102 8.0 27.2 NaN 13 201901010102 2.0 4.1 0.1 14 201901010102 7.0 27.0 0.2 15 201901010102 1.0 2.9 1.2 16 201901010102 3.0 4.2 0.1 17 201901010103 3.0 4.5 NaN 18 201901010103 1.0 3.6 NaN 19 201901010103 7.0 14.0 NaN
回答2件
あなたの回答
tips
プレビュー