即使在数据框为空的情况下,我也希望在使用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)
我当然认为应该有一个更好的过滤方法。 过滤时如何覆盖空白数据框?
答案 0 :(得分:1)
将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: []