私のデータはIDでグループ化されています。各グループでは、colBによってソートされます。パンダのcomplexby with groupby
colAがブランクで、colDが(2,3、または4)の場合は、 の列を作成し、最後のnonフラグにflag = 1を設定します。 colCのゼロ行colCが非ゼロであるそのグループの他のすべての行でフラグを0に設定します。 特定のグループの(colAがブランクで、colCが0の)行を削除します。
他のすべての 'id'グループに対して上記の手順を繰り返します。
(コーラは非空白である行の場合、私は私が必要なものにフラグを設定することができます)
ここでは、私が持っているデータである。
id colA ColB colC colD
1 10 1352.23 2
1 11 706.87 2
1 12 1116.6 2
1 13 0 2
1 14 0 2
1 15 0 2
2 2 6884.03 3
2 3 2235.97 3
2 4 3618.04 3
2 5 11745.42 3
3 2013 1 345.98 0
、ここでは、私が希望するものですそれを処理して取得する。
id colA ColB colC colD flag
1 10 1352.23 2 0
1 11 706.87 2 0
1 12 1116.6 2 1
2 2 6884.03 3 0
2 3 2235.97 3 0
2 4 3618.04 3 0
2 5 11745.42 3 1
3 2013 1 345.98 0 0
このようなグループには、数千ものデータが含まれています。上記の処理を行うためのPythonコードがどのように見えるのかを誰かが助けてくれることを願っています。私はgroupby関数に基本的に精通していますが、上記を行う方法を理解することはできません。
ここに私が使用しようとしているコードがあります。コードはエラーを返します: "AttributeError: 'str'オブジェクトには 'id'属性がありません。"
私は最終的に削除したいcolCのゼロを検出すると "フラグ"をNaNに設定しようとしていますので、後で簡単に削除できます。ここで
def setFlag(grouped):
for name, group in grouped:
for i in range(group.id.size):
drop_candidate = (
pd.isnull(group.iloc[i]['colA'])&
((group.iloc[i]['colD'] == 2) |
(group.iloc[i]['colD'] == 3) |
(group.iloc[i]['colD'] == 4) )
)
last_nonZero = group[group != 0].index[-1]
if ( (drop_candidate & (group.iloc[i]['colC'] == 0)) ):
group['flag'] = np.nan
elif ((drop_candidate & (group.iloc[i]['colC'] != 0)) & (last_nonZero != i)):
group['flag'] = 0
elif last_nonZero == i:
group['flag'] = 1
return grouped
df.groupby('id').apply(setFlag)
再作成したテストデータフレームへのコードです:
import pandas as pd
import numpy as np
df = pd.DataFrame.from_items([
('id', [1,1,1,1,1,1,2,2,2,2,3]),
('colA', [np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,2013]),
('colB', [10,11,12,13,14,15,2,3,4,5,1]),
('colC', [1352.23,706.87,1116.6,0,0,0,6884.03,2235.97,3618.04,11745.42,345.98]),
('colD', [2,2,2,2,2,2,3,3,3,3,0]),
('flag', [np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,]),
])
に変更する必要があります。ハイアレキサンダー:最新の試みを投稿しました。 – Learner
サンプルデータフレームを作成するコマンドを追加できますか? –