重新编码 pandas 列的最有效和 pythonic 方法是什么?
What is the most efficient & pythonic way to recode a pandas column?
我想要 'anonymize' 或 'recode' pandas DataFrame 中的一列。最有效的方法是什么?我写了以下内容,但似乎有内置功能或更好的方法。
dataset = dataset.sample(frac=1).reset_index(drop=False) # reorders dataframe randomly (helps anonymization, since order could have some meaning)
# make dictionary of old and new values
value_replacer = 1
values_dict = {}
for unique_val in dataset[var].unique():
values_dict[unique_val] = value_replacer
value_replacer += 1
# replace old values with new
for k, v in values_dict.items():
dataset[var].replace(to_replace=k, value=v, inplace=True)
IIUC 你想要factorize你的价值观:
dataset[var] = pd.factorize(dataset[var])[0] + 1
演示:
In [2]: df
Out[2]:
col
0 aaa
1 aaa
2 bbb
3 ccc
4 ddd
5 bbb
In [3]: df['col'] = pd.factorize(df['col'])[0] + 1
In [4]: df
Out[4]:
col
0 1
1 1
2 2
3 3
4 4
5 2
另一种方式
df.col.astype('category').cat.codes.add(1)
Out[697]:
0 1
1 1
2 2
3 3
4 4
5 2
dtype: int8
最好使用MaxU的答案:)
%timeit df.col.astype('category').cat.codes.add(1)#Wen
1000 loops, best of 3: 437 µs per loop
%timeit df['col'] = pd.factorize(df['col'])[0] + 1#MaxU
1000 loops, best of 3: 194 µs per loop
我想要 'anonymize' 或 'recode' pandas DataFrame 中的一列。最有效的方法是什么?我写了以下内容,但似乎有内置功能或更好的方法。
dataset = dataset.sample(frac=1).reset_index(drop=False) # reorders dataframe randomly (helps anonymization, since order could have some meaning)
# make dictionary of old and new values
value_replacer = 1
values_dict = {}
for unique_val in dataset[var].unique():
values_dict[unique_val] = value_replacer
value_replacer += 1
# replace old values with new
for k, v in values_dict.items():
dataset[var].replace(to_replace=k, value=v, inplace=True)
IIUC 你想要factorize你的价值观:
dataset[var] = pd.factorize(dataset[var])[0] + 1
演示:
In [2]: df
Out[2]:
col
0 aaa
1 aaa
2 bbb
3 ccc
4 ddd
5 bbb
In [3]: df['col'] = pd.factorize(df['col'])[0] + 1
In [4]: df
Out[4]:
col
0 1
1 1
2 2
3 3
4 4
5 2
另一种方式
df.col.astype('category').cat.codes.add(1)
Out[697]:
0 1
1 1
2 2
3 3
4 4
5 2
dtype: int8
最好使用MaxU的答案:)
%timeit df.col.astype('category').cat.codes.add(1)#Wen
1000 loops, best of 3: 437 µs per loop
%timeit df['col'] = pd.factorize(df['col'])[0] + 1#MaxU
1000 loops, best of 3: 194 µs per loop