私はname
列とdepartment
列のデータフレームを持っています。 name
列には、異なるdepartment
値を持つ反復がありますが、その他の列の値はすべて同じです。 フラット化これらの繰り返しを1行にして、異なる(ユニークな)部門値をリストに結合したいと思います。したがって、各グループの最初の行を取り出し、そのグループ内の一意のdepartment
値のリストにdepartment
の値を変更します。結果として得られるデータフレームは全く同じ列を持ちますが、name
列には繰り返しはなく、department
列には少なくとも1つの要素のリストがあります。カスタムpandas groupby集計関数を使用してデータフレーム内の行を結合する方法
私はgroupby
を使用し、カスタム集計関数はagg()
に渡されましたが、以下は完全に失敗します。私の考えは、私の集計関数が各グループをデータフレームとして取得し、各データフレームグループについてシリーズを返した場合、groupby.agg(flatten_departments)
の出力はデータフレームになります。
def flatten_departments(name_group):
#I thought name_group would be a df of that group
#this group is length 1 so this name doesn't actually repeat so just return same row
if len(name_group) == 1:
return name_group.squeeze() #turn length-1 df into a series to return, don't worry that department is a string and not a list for now
else:
#treat name_group like a df and get the unique departments
departments = list(name_group['department'].unique())
name_ser = name_group.iloc[0,:] #take first "row" of this group
name_ser['department'] = departments #replace department value with list of unique values from group
return name_ser
my_df = my_df.groupby(['name']).agg(flatten_departments)
これは、災害であり、name_group
は、DFが、そのインデックス元DFからインデックスであるシリーズではなく、名前がその列の値元DF価値のいくつかの他の列の名前であります。
私は
list_of_ser = []
for name, gp in my_df.groupby(['name']):
if len(gp) == 1:
list_of_ser.append(gp.squeeze())
else:
new_ser = gp.iloc[0,:]
new_ser['department'] = list(gp['department'].unique())
list_of_ser.append(new_ser)
new_df = pd.DataFrame(list_of_ser, columns=my_df.columns)
を次のように私はちょうどgroupby
オブジェクトをループのために行うことができることを知っているが、私はちょうどそれがagg
のポイントだと思いました!
agg
で目標を達成する方法や、forループが本当に正しい方法であるかについてのアイデア。 forループが正しい場合、agg
のポイントは何ですか?
ありがとうございました!あなたが他のすべての列を保持する必要がある場合
あなたの答えをありがとう、その1行の適用は完全に上司です。また、「コラム」のように辞書表記法を使って、あなたの 'agg'の例を理解しています。私がまだ混乱しているのは、パラメータが関数の場合に 'agg'をどう使いますか?' agg'ではその関数の "規則"は何ですか?なぜそれは他のランダムな列のシリーズを渡されているのですか? –
ministry
'.agg'の前に' .dept'を見てください。つまり、私はすでに 'agg'をシリーズに限定しています。これは、 'dict(dept = lambda)'が 'lambda'を使用し、' dept'カラムを呼び出すことを指定していることを意味します。 'dict'の' dept'を変更すると、別の列名があります。この場合は 'agg'を使用しません。私はちょうどあなたに例を挙げたかったので、何が起こっていたのかをよりよく知ることができました。 – piRSquared
'apply'呼び出しから出てくるデータフレームには' name'と 'department'カラムしかありません。残りのカラムもどうやって元に戻すのですか? – ministry