列 A と B を持つ DF があるので、行ごとに A と B の値の組み合わせを含む列 C を追加したいと思います。つまり、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 のオプションがあり、2 つの列の組み合わせの一意のペアをすべて見つけて、グループごとに元の DF のインデックスにアクセスする方法がわかりませんでした。助けてください?