即使dataFrame为空,也将标题保留在groupby过滤中

时间:2019-09-30 05:10:58

标签: python pandas-groupby

即使在数据框为空的情况下,我也希望在使用groupby过滤时保留列标题。

我按照以下步骤过滤数据框

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

如果数据框不为空,则此方法有效。但是,如果记录为空,则此过滤将删除column-header

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 个答案:

答案 0 :(得分:1)

GroupBy.transformmax一起用于由组的最大值填充的新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_valuesDataFrame.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: []