为了账号安全,请及时绑定邮箱和手机立即绑定

在考虑列 Python 的同时使用 pandas.qcut

在考虑列 Python 的同时使用 pandas.qcut

慕婉清6462132 2021-08-11 20:01:12
我有以下数据框:并使用 pandas.qcut 函数我正在尝试创建一个新列,该列按 Animal 减少 3 倍,如下所示:到目前为止,这是我的代码:    import pandas as pddf=pd.DataFrame({'Name':['Harry','Sally','Mary','John','Francis','Devon','James','Holly','Molly','Nancy','Ben'], 'Score': [43,234,54,34,12,43,54,65,23,12,32],                 'Animal': ['dog', 'dog', 'cat', 'cat', 'dog', 'horse', 'dog', 'snake', 'dog', 'mouse', 'horse']})tiles = pd.qcut(df.index, 3, labels=False)tiles=tiles+1df['tiles']=tilesprint(df)如何让我的 qcut 函数将我的“动物”列计入我的帐户?
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

我不知道是否qcut可行,但是您可以使用groupby('Animal').cumcount, 并取累积计数和 3 ( % 3)的模数来执行此操作:


>>> df

   Animal     Name

0     cat    Harry

1     cat    Sally

2     cat     Mary

3     dog     John

4     dog  Francis

5     dog    Devon

6     dog    James

7   horse    Holly

8   mouse    Molly

9   mouse    Nancy

10  snake      Ben


df['Tile'] = (df.groupby('Animal').cumcount()%3)+1


>>> df

   Animal     Name  Tile

0     cat    Harry     1

1     cat    Sally     2

2     cat     Mary     3

3     dog     John     1

4     dog  Francis     2

5     dog    Devon     3

6     dog    James     1

7   horse    Holly     1

8   mouse    Molly     1

9   mouse    Nancy     2

10  snake      Ben     1


查看完整回答
反对 回复 2021-08-11
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

成功的关键是适当的函数生成Tile值:


def tbl(x):

    ccl = itertools.cycle([1,2,3])

    lst = [ next(ccl) for _ in range(len(x)) ]

    return pd.Series(lst, x.index)

它的工作原理就像cumcount()有一点不同:相反顺序编号(从range)它产生的顺序循环[1,2,3]使用itertools.cycle。


然后你所要做的(在必要的导入和创建源 DataFrame 之后)是:


按 对值进行排序Animal。

Group by Animal,取任何列(例如Name)并将上述功能应用于它们。

所以整个脚本(没有tbl声明)可以如下:


import pandas as pd

import itertools


df = pd.DataFrame( {'Name': ['Harry', 'Sally', 'Mary', 'John', 'Francis',

        'Devon', 'James', 'Holly', 'Molly', 'Nancy', 'Ben'],

    'Score': [43, 234, 54, 34, 12, 43, 54, 65, 23, 12, 32],

    'Animal': ['dog', 'dog', 'cat', 'cat', 'dog', 'horse', 'dog', 'snake',

        'cat', 'mouse', 'mouse']})

df.sort_values(by='Animal', inplace=True)

df['Tile'] = df.groupby('Animal')['Name'].apply(tbl)

当你打印时df,结果是:


       Name  Score Animal  Tile

2      Mary     54    cat     1

3      John     34    cat     2

8     Molly     23    cat     3

0     Harry     43    dog     1

1     Sally    234    dog     2

4   Francis     12    dog     3

6     James     54    dog     1

5     Devon     43  horse     1

9     Nancy     12  mouse     1

10      Ben     32  mouse     2

7     Holly     65  snake     1



查看完整回答
反对 回复 2021-08-11
  • 2 回答
  • 0 关注
  • 196 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信