首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫按排序获得最高两个最小值的行

熊猫按排序获得最高两个最小值的行
EN

Stack Overflow用户
提问于 2017-02-18 05:54:26
回答 1查看 870关注 0票数 1

我想按df"A“进行分组,并导出df"B”中对应于df"C“中前两个最小值的值。

代码语言:javascript
复制
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]})

我希望结果是:

代码语言:javascript
复制
   A    B_1     B_2
0  foo  cat     possum
1  bar  racoon  dog
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-18 06:14:04

我觉得你需要:

  • groupbynsmallest
  • unstack进行整形
  • 1添加到列名
  • add_prefix last和reset_index
代码语言:javascript
复制
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

一行解决方案:

代码语言:javascript
复制
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完美地工作:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42311619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档