У меня есть DataFrame df, который я "groupby'ed". Я ищу функцию, которая похожа на get_group (name), за исключением того, что вместо того, чтобы бросать KeyError, если имя не существует, возвращает пустой DataFrame (или какое-то другое значение), похожее на то, как работает dict.get:
g = df.groupby('x')
# doesn't work, but would be nice:
i = g.get_group(1, default=[])
# does work, but is hard to read:
i = g.obj.take(g.indices.get(1, []), g.axis)
Есть ли уже функция, которая предоставляет это?
Edit:
Во многих отношениях объект GroupBy представлен dict (.indicies,.groups), и эта функциональность "получить с дефолтом" была достаточно ясной для концепции dict, что она включена в сам язык Python. Казалось, что если у диктоподобной вещи нет дефолта, возможно, я не понимаю ее правильно? Почему у диктофона вроде бы нет "получить с дефолтом"?
Сокращенный пример того, что я хочу сделать, это:
df1_bymid = df1.groupby('mid')
df2_bymid = df2.groupby('mid')
for mid in set(df1_bymid.groups) | set(df2_bymid.groups) :
rows1 = df1_bymid.get_group(mid, [])
rows2 = df1_bymid.get_group(mid, [])
for row1, row2 in itertools.product(rows1, rows2) :
yield row1, row2
Конечно, я мог бы создать функцию, и я мог бы просто подумать, что если мне придется уйти далеко от моего пути, возможно, я не использую объект GroupBy так, как это предполагалось:
def get_group(df, name, obj=None, default=None) :
if obj is None :
obj = df.obj
try :
inds = df.indices[name]
except KeyError, e :
if default is None :
raise e
inds = default
return df.obj.take(inds, df.axis)