2015-10-02 5 views
1

Один из столбцов фрейма данных pandas содержит значения, такие как 0, 'a', 'b'. Этот столбец разбирается как строка. Теперь я хочу преобразовать его в целое число, чтобы получить 0, 1, 2. Как я могу это сделать?Как преобразовать строки строк в целое число

+0

показать нам некоторый код подход пожалуйста – AndreL

+0

Можете ли вы показать репрезентативную выборку данных, ваши попытки и желаемый результат, ваше объяснение слишком основным здесь – EdChum

ответ

0

Вот некоторые исходные данные:

df = pd.DataFrame({'col': [0, 'a', 'b', 'a']}) 

>>> df 
    col 
0 0 
1 a 
2 b 
3 a 

Вы можете создать словарь элементы, которые вы хотели бы заменить:

d = {'a': 1, 'b': 2} 

Затем примените get к колонку, возвратившись-е е исходное значение, если оно не в словаре:

df['col'] = df.col.apply(lambda x: d.get(x, x)) 
>>> df 
df 
    col 
0 0 
1 1 
2 2 
3 1 

@EdChum Если все уникальные предметы, содержащиеся в серии в ключей словаря, то .map(d) более чем в пять раз быстрее. Однако любое отсутствующее значение отображается как NaN. Использование функции lambda с get в словаре, по-видимому, имеет практически идентичную производительность.

%%timeit df = pd.DataFrame({'col': [0, 'a', 'b', 'a'] * 100000}) 
df['col'] = df.col.map(d) 

10 loops, best of 3: 33.3 ms per loop 

>>> df.head() 
    col 
0 NaN 
1 1 
2 2 
3 1 
4 NaN 
%%timeit df = pd.DataFrame({'col': [0, 'a', 'b', 'a'] * 100000}) 
df['col'] = df.col.apply(lambda x: d.get(x, x)) 

10 loops, best of 3: 188 ms per loop 

%%timeit df = pd.DataFrame({'col': [0, 'a', 'b', 'a'] * 100000}) 
df['col'] = df.col.map(lambda x: d.get(x, x)) 

10 loops, best of 3: 188 ms per loop 

In [64]: %timeit df['col'] = df.col.map(d) 
10 loops, best of 3: 36.1 ms per loop 

И вот сумасшедшая часть. Я проверил это несколько строк кода ранее и получили разные результаты:

%%timeit df = pd.DataFrame({'col': [0, 'a', 'b', 'a'] * 100000}) 
df['col'] = df.col.map(d) 

10 loops, best of 3: 33.4 ms per loop 

>>> df.head() 
    col 
0 0 
1 1 
2 2 
3 1 
4 0 

>>> pd.__version__ 
'0.16.2' 
+0

Используйте для этого 'map', это cyython-ised:' df [col] .map (d) ' – EdChum

0

Держите это просто и глупо, потому что это выглядит очень просто попробовать этот подход:

if value == 'a': 
    x = 1 
if value == 'b': 
    x = 2 
else: 
    x = 0 
+0

le = preprocessing.LabelEncoder() из sklearn выполняет задание –