有一个包含 A 和 B 列的 DF,我想添加额外的 C 列,其中包括每行 A 和 B 值的组合。即,如果我有一个 DF:
A B
0 1 1
1 1 2
2 2 1
3 2 2
我想创建:
A B C
0 1 1 1_1
1 1 2 1_2
2 2 1 2_1
3 2 2 1_2
显然,我可以遍历 DF 的所有行并合并这些值。这对于大桌子来说非常慢。我也可以.unique()
用于列 A 和 B 并遍历所有组合,分别创建向量col1_un
和col2_un
,然后使用类似的东西更新表中的相关索引
cols_2_merge = ['A','B']
col1_un = DF[cols_2_merge[0]].unique()
col2_un = DF[cols_2_merge[1]].unique()
for i in range(len(col1_un)):
try:
ind1 = np.where(DF[cols_2_merge[0]].str.contains(col1_un[i], na=False))[0]
except:
ind1 = np.where(DF[cols_2_merge[0]] == col1_un[i])[0]
for j in range(len(col2_un)):
try:
ind2 = np.where(DF[cols_2_merge[1]].str.contains(col2_un[j], na=False))[0]
except:
ind2 = np.where(DF[cols_2_merge[1]] == col2_un[j])[0]
new_ind = col1_un[i] + '-' + col2_un[j]
tmp_ind = np.in1d(ind1, ind2)
ind = ind1[tmp_ind]
if len(ind) > 0:
DF[new_col_name][ind] = new_ind
这仍然很慢。我可以更多地使用它,而不是搜索整个 DF,而是将搜索字段减少到迄今为止未更改的索引。仍然很慢。
有一个 group by 选项正是我想要的,找到两列的所有唯一组合对,它相对较快,但我还没有弄清楚如何访问每个组的原始 DF 的索引。请帮忙?