2 回答
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
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
添加回答
举报