gpt4 book ai didi

python - Pandas groupby 排序以获取前两个最小值的行

转载 作者:行者123 更新时间:2023-12-01 03:17:44 25 4
gpt4 key购买 nike

我想对 df["A"] 进行分组并导出 df["B"] 中与 df["C"] 中前两个最小值相对应的值

df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B': ['cat', 'dog', 'rat', 'lion',
'bat', 'racoon', 'possum', 'deer'],
'C': [1, 2, 6, 4, 3, 1, 2, 4]})

我想要的结果是:

   A    B_1     B_2
0 foo cat possum
1 bar racoon dog

最佳答案

我认为你需要:

df1 = df.set_index('B')
.groupby('A', sort=False)['C']
.apply(lambda x: pd.Series(x.nsmallest(2).index))
.unstack()
df1.columns = df1.columns + 1
df1 = df1.add_prefix('B_').reset_index()
print (df1)
A B_1 B_2
0 foo cat possum
1 bar racoon dog

单行解决方案:

df1 = df.set_index('B')
.groupby('A', sort=False)['C']
.apply(lambda x: pd.Series(x.nsmallest(2).index, index =['B_1','B_2']))
.unstack()
.reset_index()
print (df1)
A B_1 B_2
0 foo cat possum
1 bar racoon dog

编辑:

它也可以完美地与datetime配合使用:

np.random.seed(100)
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B': ['cat', 'dog', 'rat', 'lion',
'bat', 'racoon', 'possum', 'deer'],
'C': np.random.choice(pd.date_range('2017-02-18',
periods=8),
size=8, replace=False)})
print (df)
A B C
0 foo cat 2017-02-19
1 bar dog 2017-02-22
2 foo rat 2017-02-23
3 bar lion 2017-02-20
4 foo bat 2017-02-24
5 bar racoon 2017-02-21
6 foo possum 2017-02-25
7 foo deer 2017-02-18

print (df.dtypes)
A object
B object
C datetime64[ns]

df1 = df.set_index('B')
.groupby('A', sort=False)['C']
.apply(lambda x: pd.Series(x.nsmallest(2).index, index =['B_1','B_2']))
.unstack()
.reset_index()
print (df1)
A B_1 B_2
0 foo deer cat
1 bar lion racoon

关于python - Pandas groupby 排序以获取前两个最小值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42311619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com