次の df があります。
id1 id2 id3(expected_col)
21 4 21a
21 4 21a
21 4 21a
21 5 21b
22 6 22a
22 6 22a
22 6 22a
23 7 23a
23 7 23a
23 8 23b
23 9 23c
id1 と id2 の 2 つの列があります。前の 2 つの列の組み合わせである id3 を生成する新しい列を作成したいと思います。
整数部分は id1 列と同じですが、id2が変更されるたびに変更される文字列を追加し、新しいid1に遭遇するたびにアルファベットのサイクルが "a" で再び開始されるようにします。
したがって、おそらく id1 を消去してから残りの操作を実行できますが、新しい列の文字列のアルファベットを生成する方法がわかりません。上記の df id3 は、私が期待する結果の列です。
不明な点がありましたらお知らせください。
GroupBy-Apply アプローチを使用してshift
、 、ne
、およびcumsum
'id2' のグループ レベルで使用して変更を決定し、ascii_lowercase
文字に対してマッピングします。
from string import ascii_lowercase
def combine_ids(grp, letters):
grp = grp.ne(grp.shift()).cumsum() - 1
return str(grp.name) + grp.map(letters)
letters = pd.Series(list(ascii_lowercase))
df['id3'] = df.groupby('id1')['id2'].apply(combine_ids, letters)
上記は、追加に必要な文字は 26 文字までであると想定しています。さらに必要な場合は、以下のような手順を使用して、繰り返し文字「aa」~「zz」を追加できます。
from itertools import product
from string import ascii_lowercase
doubles = map(''.join, product(ascii_lowercase, repeat=2))
letters = pd.Series(list(ascii_lowercase) + list(doubles))
結果の出力:
id1 id2 id3
0 21 4 21a
1 21 4 21a
2 21 4 21a
3 21 5 21b
4 22 6 22a
5 22 6 22a
6 22 6 22a
7 23 7 23a
8 23 7 23a
9 23 8 23b
10 23 9 23c
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加