【发布时间】:2018-01-10 01:01:30
【问题描述】:
例如,我有如下数据框。
>>> 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'],我需要考虑以表明观察值是 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_dummies 会考虑整个数据框/列上的所有可能值(或 k-1 值)。目前,我正在做的是遍历列表并为每一行执行应用。
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)
【问题讨论】:
-
您能否详细说明“使其更复杂”部分?您在那里的预期输出是什么?
-
@cᴏʟᴅsᴘᴇᴇᴅ,请参阅我对“复杂”部分的最新编辑。谢谢。
-
谢谢,这很有帮助。如果需要,我已将其添加到我的答案中。
-
感谢您的回答,我会做一些测试并接受适合我需要的答案,因为我需要为大约 10M 的观察进行此操作。
-
嗯...在为复杂查询运行我的代码时,您可能会遭受内存爆裂...谢谢。我会尝试看看是否可以提出一种速度较慢但内存效率更高的技术。