Сохраняйте заголовки в групповой фильтрации, даже если dataFrame пуст - PullRequest
1 голос
/ 30 сентября 2019

Я хочу сохранить заголовок столбца, когда использую групповую фильтрацию, даже если датафрейм пуст.

Я фильтрую фрейм данных следующим образом

df_groupby = df.groupby("ID",as_index=False).apply(lambda x: x[x["col"] == x["col"].max()]).reset_index(drop=True)
print(df_groupby)

   ID  col
0   1    4
1   2    5

Это работает, если фрейм данных не пустой. Однако, если запись пуста, эта фильтрация отбрасывает заголовок столбцов

df_empty = pd.DataFrame(columns=["ID", "col"])
df_groupby = df_empty.groupby("ID",as_index=False,group_keys=True).apply(lambda x: x[x["col"] == x["col"].max()]).reset_index(drop=True)
print(df_groupby)

-

Я ожидаю, что фрейм данных без записи с заголовками будет

   ID  col

Мое временное решение - добавить эти строки после фильтрации.

if df_groupby.empty:
   df_groupby = pd.DataFrame(columns=df_empty.columns)

Я, конечно, думаю, что должен быть лучший способ фильтрации. Как я могу покрыть пустой фрейм данных при фильтрации?

1 Ответ

1 голос
/ 30 сентября 2019

Используйте GroupBy.transform с max для новых Series, заполненных максимальными значениями группы, поэтому возможна фильтрация по boolean indexing, а также возвращаются имена столбцов для пустых DataFrame:

df = pd.DataFrame(columns=["ID", "col"])

df_groupby = df[df.groupby("ID")["col"].transform('max') == df['col']].reset_index(drop=True)
print(df_groupby)
Empty DataFrame
Columns: [ID, col]
Index: []

Тест с данными:

df = pd.DataFrame({
         'ID':[4,5,4,5,5,4],
         'col':[7,8,9,4,2,3],
})


df_groupby = df[df.groupby("ID")["col"].transform('max') == df['col']].reset_index(drop=True)
print(df_groupby)
   ID  col
0   5    8
1   4    9

Деталь :

print(df.groupby("ID")["col"].transform('max'))
0    9
1    8
2    9
3    8
4    8
5    9
Name: col, dtype: int64

Другое решение с DataFrame.sort_values и DataFrame.drop_duplicates - но он всегда возвращает только одну строку на группу:

df = pd.DataFrame(columns=["ID", "col"])

df_groupby = df.sort_values(['ID','col'], ascending=False).drop_duplicates('ID')
print(df_groupby)
Empty DataFrame
Columns: [ID, col]
Index: []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...