基于类别列表的Dummify变量

2024-10-04 05:25:04 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,我有如下的dataframe。你知道吗

>>> df
  CATX CATY CATZ
0    A    G  AAA
1    B    H  BBB
2    C    I  AAA
3    B    J  CCC
4    A    G  BBB
5    B    H  DDD
6    D    K  EEE
7    E    L  FFF

我想根据列表中提供的值在df上添加新列。例如,对于CATZ,我需要考虑一个列表['AAA', 'BBB'],以指示obervation为1或0

>>> df
  CATX CATY CATZ  AAA  BBB
0    A    G  AAA    1    0
1    B    H  BBB    0    1
2    A    I  AAA    1    0
3    B    J  CCC    0    0
4    A    H  BBB    0    1
5    B    H  DDD    0    0
6    D    K  EEE    0    0
7    E    L  FFF    0    0

这与pd.get_dummies有些不同,因为get\u dummies考虑了整个数据帧/列上所有可能的值(或k-1值)。目前,我所做的是在列表中循环并对每一行执行apply。你知道吗

for catz_item in catz_list:
    df[catz_item] = df.apply(lambda x: 1 if x.CATZ == catz_item else 0, axis=1)

除了遍历列表(因为这个循环有点慢)之外,还有其他方法可以做到这一点吗。为了使它更复杂,我还使用了基于特定列表的CATX和CATY的组合,例如['a','G'],['a','H'],['B','H']]。你知道吗

---编辑---

CATX/CATY组合输出

>>> df
  CATX CATY CATZ  AAA  BBB  AG  AH  BH
0    A    G  AAA    1    0   1   0   0
1    B    H  BBB    0    1   0   0   1
2    C    I  AAA    1    0   0   0   0
3    B    J  CCC    0    0   0   0   0
4    A    G  BBB    0    1   1   0   0
5    B    H  DDD    0    0   0   0   1
6    D    K  EEE    0    0   0   0   0
7    E    L  FFF    0    0   0   0   0

我现在使用的代码如下

catxy_list = [['A', 'G'], ['A', 'H'], ['B', 'H']]   
for catxy_item in catxy_list:
    df[catxy_item[0] + catxy_item[1]] = df.apply(lambda x: 1 if x.CATX == catxy_item[0] and x.CATY == catxy_item[1] else 0, axis=1)

Tags: df列表fffitemapplybbbcccddd
3条回答

对于涉及CATZ的第一位,可以使用where/mask+get_dummies-

v = df.CATZ.where(df.CATZ.isin(['AAA', 'BBB'])).str.get_dummies()

或者

v = df.CATZ.mask(~df.CATZ.isin(['AAA', 'BBB'])).str.get_dummies()

接下来,对于您的“复杂查询”,使用numpy广播,并在末尾进行astype转换-

# initial values to compare
i = np.array([['A', 'G'], ['A', 'H'], ['B', 'H']])
# perform broadcasted comparison with `i` and convert the result to OHEs
j = (df.iloc[:, :-1].values[:, None] == i).all(2).astype(int)

# load the result into a dataframe  with the appropriate column names 
j = pd.DataFrame(j, columns=list(map(''.join, i)))

对于“复杂查询”,另一个速度较慢但内存效率更高的选项是循环遍历每个类别并查找OHE:

ohe = []
for x, y in [['A', 'G'], ['A', 'H'], ['B', 'H']]:
    # generate OHEs for each pair of elements per category
    s = df.CATX.eq(x) & df.CATY.eq(y)  # s = df[['CATX', 'CATY']].isin([x, y]).all(1)
    s.name = ''.join([x, y])
    ohe.append(s)

# concatenate the intermediate results
j = pd.concat(ohe, 1).astype(int)

最后,您可以使用concatdfvj加载到新的数据帧中。你知道吗

pd.concat([df, v, j], 1)

  CATX CATY CATZ  AAA  BBB  AG  AH  BH
0    A    G  AAA    1    0   1   0   0
1    B    H  BBB    0    1   0   0   1
2    C    I  AAA    1    0   0   0   0
3    B    J  CCC    0    0   0   0   0
4    A    G  BBB    0    1   1   0   0
5    B    H  DDD    0    0   0   0   1
6    D    K  EEE    0    0   0   0   0
7    E    L  FFF    0    0   0   0   0
pd.crosstab(df.index,df.CATZ)[['AAA','BBB']]
Out[66]: 
CATZ   AAA  BBB
row_0          
0        1    0
1        0    1
2        1    0
3        0    0
4        0    1
5        0    0
6        0    0
7        0    0

pd.concat([df,pd.crosstab(df.index,df.CATZ)[['AAA','BBB']]],1)
Out[68]: 
      CATX CATY CATZ  AAA  BBB
row_0                         
0        A    G  AAA    1    0
1        B    H  BBB    0    1
2        C    I  AAA    1    0
3        B    J  CCC    0    0
4        A    G  BBB    0    1
5        B    H  DDD    0    0
6        D    K  EEE    0    0
7        E    L  FFF    0    0
In [403]: df.join(df.CATZ.str.get_dummies())
Out[403]:
  CATX CATY CATZ  AAA  BBB  CCC  DDD  EEE  FFF
0    A    G  AAA    1    0    0    0    0    0
1    B    H  BBB    0    1    0    0    0    0
2    C    I  AAA    1    0    0    0    0    0
3    B    J  CCC    0    0    1    0    0    0
4    A    G  BBB    0    1    0    0    0    0
5    B    H  DDD    0    0    0    1    0    0
6    D    K  EEE    0    0    0    0    1    0
7    E    L  FFF    0    0    0    0    0    1

或:

In [410]: df.join(df.CATZ[df.CATZ.isin(['AAA','BBB'])].str.get_dummies(), how='left').fillna(0)
Out[410]:
  CATX CATY CATZ  AAA  BBB
0    A    G  AAA  1.0  0.0
1    B    H  BBB  0.0  1.0
2    C    I  AAA  1.0  0.0
3    B    J  CCC  0.0  0.0
4    A    G  BBB  0.0  1.0
5    B    H  DDD  0.0  0.0
6    D    K  EEE  0.0  0.0
7    E    L  FFF  0.0  0.0

相关问题 更多 >