【发布时间】:2019-03-21 05:38:24
【问题描述】:
我必须处理包含数十万行的整个数据框,但我可以将其简化如下:
df = pd.DataFrame([
('a', 1, 1),
('a', 0, 0),
('a', 0, 1),
('b', 0, 0),
('b', 1, 0),
('b', 0, 1),
('c', 1, 1),
('c', 1, 0),
('c', 1, 0)
], columns=['A', 'B', 'C'])
print (df)
A B C
0 a 1 1
1 a 0 0
2 a 0 1
3 b 0 0
4 b 1 0
5 b 0 1
6 c 1 1
7 c 1 0
8 c 1 0
我的目标是根据“A”列中的标签来展平“B”和“C”列
A B_1 B_2 B_3 C_1 C_2 C_3
0 a 1 0 0 1 0 1
3 b 0 1 0 0 0 1
6 c 1 1 1 1 0 0
我编写的代码给出了我想要的结果,但是它非常慢,因为它在唯一标签上使用了一个简单的 for 循环。 我看到的解决方案是编写一些优化我的代码的向量化函数。有人有什么想法吗? 下面我附上代码。
added_col = ['B_1', 'B_2', 'B_3', 'C_1', 'C_2', 'C_3']
new_df = df.drop(['B', 'C'], axis=1).copy()
new_df = new_df.iloc[[x for x in range(0, len(df), 3)], :]
new_df = pd.concat([new_df,pd.DataFrame(columns=added_col)], sort=False)
for e, elem in new_df['A'].iteritems():
new_df.loc[e, added_col] = df[df['A'] == elem].loc[:,['B','C']].T.values.flatten()
【问题讨论】:
-
为一个结构合理的问题点赞。 :)
-
我的直觉认为,在你进行的过程中构建一个新数组,而不是每次迭代都调用 flatten(),这样会大大加快速度。
标签: pandas dataframe vectorization