我有一个数据集,其中的列包含类别。我想做的就是将这些类别合并为新类别。
我的数据集如下所示(类别列是字符串列),我有160个类别。
在我的示例下面,仅显示四个类别。
Category
ZA-01
ZA-01
ZA-01
ZA-01
XA-01
XA-01
XA-01
XA-01
YA-01
YA-01
YA-01
YA-01
WA-01
WA-01
WA-01
WA-01
我想得到的是以下内容(数据帧中行的原始顺序不变,这很重要)
Category New_Category
ZA-01 A
ZA-01 A
ZA-01 A
ZA-01 A
XA-01 A
XA-01 A
XA-01 A
XA-01 A
YA-01 B
YA-01 B
YA-01 B
YA-01 B
WA-01 B
WA-01 B
WA-01 B
WA-01 B
最简单的方法是使用if elif语句,但是如果您有160个类别,这是一项艰巨的任务,很容易出错。
[我希望Python要做的是使用df。[['categories]]。unique()来获得唯一的类别,该类别会保留数据帧中类别的顺序,然后对Python说:group category one(ZA- 01),然后将两个(XA-01)合并为一个新的名为A的类别,然后将类别3(YA-01)和四个(WA-01)分组为一个新的名为B的类别,等等。
在Python中有没有使用if elif语句的方法吗?
如果有的话
Group Category
A ZA-01
A ZA-01
A ZA-01
A ZA-01
A XA-01
A XA-01
A XA-01
A XA-01
B YA-01
B YA-01
B YA-01
B YA-01
B WA-01
B WA-01
B WA-01
B WA-01
而且我想在一个组中合并两个类别的类别
所以我想得到
Group Category New_Category
A ZA-01 1
A ZA-01 1
A ZA-01 1
A ZA-01 1
A XA-01 1
A XA-01 1
A XA-01 1
A XA-01 1
B YA-01 2
B YA-01 2
B YA-01 2
B YA-01 2
B WA-01 2
B WA-01 2
B WA-01 2
B WA-01 2
使用pd.factorize
和Floor div 2
df['new_category'] = pd.factorize(df.Category)[0] // 2
Out[154]:
Category new_category
0 ZA-01 0
1 ZA-01 0
2 ZA-01 0
3 ZA-01 0
4 XA-01 0
5 XA-01 0
6 XA-01 0
7 XA-01 0
8 YA-01 1
9 YA-01 1
10 YA-01 1
11 YA-01 1
12 WA-01 1
13 WA-01 1
14 WA-01 1
15 WA-01 1
上面有new_category
后,如果要映射到自定义类别,只需执行以下附加步骤
cats = np.array(['A', 'B'])
df['new_category'] = cats[df['new_category']]
Out[163]:
Category new_category
0 ZA-01 A
1 ZA-01 A
2 ZA-01 A
3 ZA-01 A
4 XA-01 A
5 XA-01 A
6 XA-01 A
7 XA-01 A
8 YA-01 B
9 YA-01 B
10 YA-01 B
11 YA-01 B
12 WA-01 B
13 WA-01 B
14 WA-01 B
15 WA-01 B
添加创建字母类别的@piRSquare方法
from string import ascii_uppercase
from itertools import product
import numpy as np
letters = [*ascii_uppercase]
leading = [''] + letters
cats = np.array([*map(''.join, product(*[leading] * 3, letters))])
或
from string import ascii_uppercase
from itertools import product
cats = np.array([*map(''.join, product(['', *ascii_uppercase], ascii_uppercase))])
cats[df.Category.factorize()[0] // 2]
Out[13]:
array(['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B',
'B', 'B', 'B'], dtype='<U2')
您可以按照map
的说明进行操作:
cats = df.Category.unique()
# define new categories
# replace np.arange(len(cats)) with your category names
# e.g ['A','B']
new_cats = np.repeat(np.arange(len(cats)), 2)[:len(cats)]
s = pd.Series(new_cats, index=cats)
df['New_Cat'] = df['Category'].map(s)
输出:
Category New_Cat
0 ZA-01 0
1 ZA-01 0
2 ZA-01 0
3 ZA-01 0
4 XA-01 0
5 XA-01 0
6 XA-01 0
7 XA-01 0
8 YA-01 1
9 YA-01 1
10 YA-01 1
11 YA-01 1
12 WA-01 1
13 WA-01 1
14 WA-01 1
15 WA-01 1
Detail:s
是
ZA-01 0
XA-01 0
YA-01 1
WA-01 1
dtype: int32
您可以使用np.where
np.where
如果您需要两个以上的新类别,则需要df['New_category']=np.where(df['Category'].isin(['ZA-01','XA-01']),'A','B')
print(df)
Category New_category
0 ZA-01 A
1 ZA-01 A
2 ZA-01 A
3 ZA-01 A
4 XA-01 A
5 XA-01 A
6 XA-01 A
7 XA-01 A
8 YA-01 B
9 YA-01 B
10 YA-01 B
11 YA-01 B
12 WA-01 B
13 WA-01 B
14 WA-01 B
15 WA-01 B
:
np.select