我有以下数据框:
并使用pandas.qcut函数尝试创建一个新的列,该列将按Animal切成3倍,如下所示:
到目前为止,这是我的代码:
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函数考虑到我的“动物”列?
先谢谢了。
答案 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