在熊猫中将多个类别合并为一个类别

问题描述 投票:2回答:2

我有一个数据集,其中的列包含类别。我想做的就是将这些类别合并为新类别。

我的数据集如下所示(类别列是字符串列),我有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
pandas categories pandas-groupby
2个回答
4
投票

使用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')

3
投票

您可以按照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

Details

ZA-01    0
XA-01    0
YA-01    1
WA-01    1
dtype: int32

-1
投票

您可以使用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
© www.soinside.com 2019 - 2024. All rights reserved.