2017-12-11 1 views
1

に各グループでの値にベースを与える「私は列に基づいて新しい列を持つようにしたい新しい列を定義するとPython

a b c 
e1 21 99 
e1 21 99 
e2 22 99 
e3 23 99 
e1 23 99 
e3 24 99 
e4 27 99 
e1 25 99 
e2 29 99 
e4 22 99 
e2 23 99 

次のデータセットを考えてみましょう』:

私は、彼らが同じグループに属している場合は、新しい列Dを追加し、同じ値を与える必要があります。 私は、各グループで自分のデータをフィルタリングし、各グループに同じ値を設定する方法がわからない。 ここ
a  b c d 
e_11 21 99 1 
e_11 21 99 1 
e_21 22 99 2 
e_31 23 99 3 
e_11 23 99 1 
e_31 24 99 3 
e_41 27 99 4 
e_11 25 99 1 
e_21 29 99 2 
e_41 22 99 4 
e_21 23 99 2 

されます私に正しい答えを与えないコード:

一度であなたの要件の両方を持っている
i=0 
e=[] 
for name in df.groupby('a'): 
    for j in range(len(name)): 

    e.append(i) 
i++ 

df['d'] = pd.Series(e) 
print(df) 
+1

https://stackoverflow.com/questions/47703634/pandas-group-by-and-assign-a-group-id-then-ungroup/47703735#47703735、これを達成するための複数の方法 – Wen

答えて

1

一つの方法は、次のようになります。

df.head()を使用して得
import regex as re 

rx = re.compile(r'(?V1)(?<=[a-z])(?=\d+)') 
def splitter(row): 
    (char, number) = rx.split(row['a']) 
    return pd.Series({'a': '{}_{}{}'.format(char, number, number), 'd': number}) 

df[['a', 'd']] = df.apply(splitter, axis = 1) 


a  b c d 
0 e_11 21 99 1 
1 e_11 21 99 1 
2 e_22 22 99 2 
3 e_33 23 99 3 
4 e_11 23 99 1 


ここでの考え方は、設定することです splitter文字と数字を分割する機能。関数は行単位で適用され、新しい列が返されます。空の分割が機能するには、新しい regexモジュールが必要です。

関連する問題