执行 groupby 时保留其他列[重复]
- 2025-01-20 09:07:00
- admin 原创
- 84
问题描述:
我groupby
在 pandas 数据框中使用删除所有不包含特定列最小值的行。如下所示:
df1 = df.groupby("item", as_index=False)["diff"].min()
但是,如果我有超过这两列,其他列(例如otherstuff
在我的示例中)将被删除。我可以使用保留这些列吗groupby
,还是我必须找到其他方法来删除行?
我的数据如下:
item diff otherstuff
0 1 2 1
1 1 1 2
2 1 3 7
3 2 -1 0
4 2 1 3
5 2 4 9
6 2 -6 2
7 3 0 0
8 3 2 9
最终结果应该是这样的:
item diff otherstuff
0 1 1 2
1 2 -6 2
2 3 0 0
但我得到的是:
item diff
0 1 1
1 2 -6
2 3 0
我已经浏览了文档,但找不到任何东西。我尝试过:
df1 = df.groupby(["item", "otherstuff"], as_index=false)["diff"].min()
df1 = df.groupby("item", as_index=false)["diff"].min()["otherstuff"]
df1 = df.groupby("item", as_index=false)["otherstuff", "diff"].min()
但这些都不起作用。
解决方案 1:
方法 1:使用idxmin()
获取最小元素的索引diff
,然后选择这些元素:
>>> df.loc[df.groupby("item")["diff"].idxmin()]
item diff otherstuff
1 1 1 2
6 2 -6 2
7 3 0 0
[3 rows x 3 columns]
方法 #2:按排序diff
,然后取每组中的第一个元素item
:
>>> df.sort_values("diff").groupby("item", as_index=False).first()
item diff otherstuff
0 1 1 2
1 2 -6 2
2 3 0 0
[3 rows x 3 columns]
请注意,即使行内容相同,结果索引也不同。
解决方案 2:
您可以DataFrame.sort_values
使用DataFrame.drop_duplicates
:
df = df.sort_values(by='diff').drop_duplicates(subset='item')
print (df)
item diff otherstuff
6 2 -6 2
7 3 0 0
1 1 1 2
如果可能的话,每个组有多个最小值,并且希望所有最小行都使用boolean indexing
每个transform
组的最小值:
print (df)
item diff otherstuff
0 1 2 1
1 1 1 2 <-multiple min
2 1 1 7 <-multiple min
3 2 -1 0
4 2 1 3
5 2 4 9
6 2 -6 2
7 3 0 0
8 3 2 9
print (df.groupby("item")["diff"].transform('min'))
0 1
1 1
2 1
3 -6
4 -6
5 -6
6 -6
7 0
8 0
Name: diff, dtype: int64
df = df[df.groupby("item")["diff"].transform('min') == df['diff']]
print (df)
item diff otherstuff
1 1 1 2
2 1 1 7
6 2 -6 2
7 3 0 0
解决方案 3:
如果有/您想要一个分钟,上述答案非常有效。在我的例子中,可能会有多个分钟,我希望所有行都等于分钟,但这.idxmin()
并不会给你。这有效
def filter_group(dfg, col):
return dfg[dfg[col] == dfg[col].min()]
df = pd.DataFrame({'g': ['a'] * 6 + ['b'] * 6, 'v1': (list(range(3)) + list(range(3))) * 2, 'v2': range(12)})
df.groupby('g',group_keys=False).apply(lambda x: filter_group(x,'v1'))
顺便说一句,.filter()也与这个问题相关,但对我来说不起作用。
解决方案 4:
我尝试了所有人的方法,但都无法正常工作。相反,我一步一步地完成了整个过程,最终得到了正确的结果。
df.sort_values(by='item', inplace=True, ignore_index=True)
df.drop_duplicates(subset='diff', inplace=True, ignore_index=True)
df.sort_values(by=['diff'], inplace=True, ignore_index=True)
进一步解释一下:
按您想要的最小值对项目进行排序
删除要排序的列的重复项
对数据进行重新排序,因为数据仍然按最小值排序
解决方案 5:
如果您知道所有“项目”都有多个可以排序的记录,那么使用duplicated
:
df.sort_values(by='diff').duplicated(subset='item', keep='first')
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD