Chcę grupować dwie wartości, a jeśli grupa zawiera więcej niż jeden element, zwróć tylko pierwszy wiersz grupy o wartości zastępowanej średniej grupy. Jeśli jest tylko jeden element, chcę wrócić bezpośrednio. Mój kod wygląda tak:

final = df.groupby(["a", "b"]).apply(condense).drop(['a', 'b'], axis=1).reset_index()

def condense(df):
    if df.shape[0] > 1:
        mean = df["c"].mean()
        record = df.iloc[[0]]
        record["c"] = mean
        return(record)
    else:
        return(df)

A DF wygląda w ten sposób:

a      b     c   d
"f"   "e"    2   True
"f"   "e"    3   False
"c"   "a"    1   True

Ponieważ rama danych jest dość duża, mam 73800 grup, a obliczenia całego Groupby + zastosowanie trwa około minuty. To jest zbyt długie. Czy istnieje sposób, aby uruchomić szybciej?

2
LizzAlice 19 październik 2020, 15:25

1 odpowiedź

Najlepsza odpowiedź

Myślę, że o jednej wartości jest taka sama jak średnia wielokrotnie, dzięki czemu można rozwiązać rozwiązanie uproszczone przez GroupBy.agg z {x1}} do kolumny c i wszystkie inne wartości agregują przez first:

d = dict.fromkeys(df.columns.difference(['a','b']), 'first')
d['c'] = 'mean'
print (d)
{'c': 'mean', 'd': 'first'}

df = df.groupby(["a", "b"], as_index=False).agg(d)
print (df)
   a  b    c     d
0  c  a  1.0  True
1  f  e  2.5  True
2
jezrael 19 październik 2020, 12:37