例如,我有如下的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)
对于涉及
CATZ
的第一位,可以使用where
/mask
+get_dummies
-或者
接下来,对于您的“复杂查询”,使用numpy广播,并在末尾进行
astype
转换-对于“复杂查询”,另一个速度较慢但内存效率更高的选项是循环遍历每个类别并查找OHE:
最后,您可以使用
concat
将df
、v
和j
加载到新的数据帧中。你知道吗或:
相关问题 更多 >
编程相关推荐