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

我有以下数据框:

http://img4.mukewang.com/6113bc1900011c5501760279.jpg

并使用 pandas.qcut 函数我正在尝试创建一个新列,该列按 Animal 减少 3 倍,如下所示:

http://img3.mukewang.com/6113bc220001366a02230271.jpg

到目前为止,这是我的代码:


    import pandas as pd

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', 'dog', 'mouse', 'horse']})

tiles = pd.qcut(df.index, 3, labels=False)

tiles=tiles+1

df['tiles']=tiles

print(df)

如何让我的 qcut 函数将我的“动物”列计入我的帐户?


慕婉清6462132
浏览 197回答 2
2回答

慕运维8079593

我不知道是否qcut可行,但是您可以使用groupby('Animal').cumcount, 并取累积计数和 3 ( % 3)的模数来执行此操作:>>> df   Animal     Name0     cat    Harry1     cat    Sally2     cat     Mary3     dog     John4     dog  Francis5     dog    Devon6     dog    James7   horse    Holly8   mouse    Molly9   mouse    Nancy10  snake      Bendf['Tile'] = (df.groupby('Animal').cumcount()%3)+1>>> df   Animal     Name  Tile0     cat    Harry     11     cat    Sally     22     cat     Mary     33     dog     John     14     dog  Francis     25     dog    Devon     36     dog    James     17   horse    Holly     18   mouse    Molly     19   mouse    Nancy     210  snake      Ben     1

蝴蝶刀刀

成功的关键是适当的函数生成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 pdimport itertoolsdf = 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  Tile2      Mary     54    cat     13      John     34    cat     28     Molly     23    cat     30     Harry     43    dog     11     Sally    234    dog     24   Francis     12    dog     36     James     54    dog     15     Devon     43  horse     19     Nancy     12  mouse     110      Ben     32  mouse     27     Holly     65  snake     1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python