-1

列 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_uncol2_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 のインデックスにアクセスする方法がわかりませんでした。助けてください?

4

2 に答える 2

0

@ジョリス - どうもありがとう。もちろん、うまくいきました!FAST、追加する必要があります:-)

より複雑なグループベースの組み合わせについては、使用できます

GB = DF[cols_2_merge].groupby(cols_2_merge)
for i in GB.groups:
    DO WHATEVER YOU WANT...

再度、感謝します!

于 2015-03-16T08:24:35.243 に答える