2015-10-23 3 views
2

Учитывая следующий кадр данных:Панды Преобразование смешанных типов в строку

DF = pd.DataFrame({'COL1': ['A', 'B', 'C', 'D','D','D'], 
'mixed': [2016.0, 2017.0, 'sweatervest', 20, 209, 21]}) 
DF 

    COL1 mixed 
0 A  2016.0 
1 B  2017.0 
2 C  sweatervest 
3 D  20 
4 D  209 
5 D  21 

Я хочу, чтобы преобразовать «смешанными» на объект таким образом, что все числа являются целыми числами, как строки и остаются все строки, конечно, строка. Нужный выход следующим образом:

COL1 mixed 
0 A  2016 
1 B  2017 
2 C  sweatervest 
3 D  20 
4 D  209 
5 D  21 

Справочная информация:

Первоначально, «смешанные» был частью кадра данных, взятой из CSV, которая в основном состояла из чисел, с некоторыми строками здесь и там. Когда я попытался преобразовать его в строку, некоторые числа закончились с «.0» в конце.

Заранее спасибо ...

+0

Ваши исходные данные имеют номера с '.0' в конце. Они «плавают». Вы хотите отнести их к 'int' first? – TigerhawkT3

+0

Я так считаю. В CSV-файле, который я использую, таких десятичных знаков нет. Они получили десятичные знаки после того, как я преобразовал их в строки через astype (str). Поэтому, возможно, мне следует начать с этого шага, если это будет проще. В противном случае, я хотел бы сначала указать числовые значения как float. –

+0

Похоже, что некоторые читаются десятичными знаками, а другие - нет. Поэтому я думаю, что мне нужно: конвертировать float в ints, а затем в строки, преобразовывать ints в строки и сохранять строки как строки ... но я не знаю, как это сделать. –

ответ

1

попробовать:

DF['mixed']=DF.mixed.astype(object) 

это приводит:

DF['mixed'] 

0   2016 
1   2017 
2 sweatervest 
3    20 
4   209 
5    21 
Name: mixed, dtype: object 
+0

Я просто попробовал это. Он оставил десятичные числа как научную нотацию. –

+0

И все же соединение работало, поэтому для моих целей это решило проблему. Спасибо вам обоим. –

+0

Кстати ... в чем разница между использованием DF ['mixed'] = DF.mixed.astype (object) и DF.mixed = DF.mixed.astype (object)? –

1

df.mixed = df.mixed.apply(lambda elt: str(int(elt)) if isinstance(elt, float) else str(elt))

Это вызывает функцию lambda elt: str(int(elt)) if isinstance(elt, float) else str(elt) над каждым элементом " смешанной "колонке.

Примечание: предполагается, что все ваши поплавки могут быть конвертированы в целые числа, как вы подразумевали в своих комментариях к своему вопросу.

+0

Я пробовал это, но получил эту ошибку: ValueError: невозможно преобразовать float NaN в integer –

+0

Если вы хотите выяснить, что вызывает проблему, отмените 'lambda' на отдельную функцию (определенную с помощью' def') и добавьте блок try-except вокруг выражения с некоторыми заявлениями печати. – gbrener

Смежные вопросы