考虑到Python列时使用pandas.qcut

时间:2018-11-08 17:23:25

标签: python pandas dataframe

我有以下数据框:

enter image description here

并使用pandas.qcut函数尝试创建一个新的列,该列将按Animal切成3倍,如下所示:

enter image description here

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

    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函数考虑到我的“动物”列?

先谢谢了。

2 个答案:

答案 0 :(得分:2)

我不知道是否要使用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

答案 1 :(得分: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排序。
  • 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