Функция полоски панд также удаляет числовые значения - PullRequest
1 голос
/ 13 июня 2019

У меня есть фрейм данных, который можно сгенерировать из кода ниже

data_file= pd.DataFrame({'studyid':[1,2,3],'age_interview': [' 56','57 ','55'],'ethnicity': ['Chinese','Indian','European'],'Marital_status': ['Single','Married','Widowed'],'Smoke_status':['Yes','No','No']}) 

Как только я создаю вышеупомянутый фрейм данных, я растопить его и применить функцию полосы

obs = data_file.melt('studyid', value_name='valuestring').sort_values('studyid')
obs['valuestring'].str.strip()

Хотя этоотлично работает в примерах данных, в реальных данных также удаляет числовые значения.Я придерживаюсь того же кода, что и выше, но только данные разные.

Пожалуйста, найдите скриншоты до и после функции полосы

вывод перед "obs ['valuestring']. Str.strip ()"

enter image description here

вывод после "obs ['valuestring']. Str.strip ()"

enter image description here

Как предотвратить удаление числовых значений?

1 Ответ

1 голос
/ 13 июня 2019

Похоже, ваш столбец имеет смешанные целые и строки. Вот воспроизводимый пример:

s = pd.Series([1, np.nan, 'abc ', 2.0, '  def '])
s.str.strip()

0    NaN
1    NaN
2    abc
3    NaN
4    def
dtype: object

Если значение не является строковым, оно неявно обрабатывается как NaN.

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

s.astype(str).str.strip()

0      1
1    nan
2    abc
3    2.0
4    def
dtype: object

В вашем случае это было бы

obs['valuestring'] = obs['valuestring'].astype(str).str.strip()

Обратите внимание, что если вы хотите сохранить NaN, используйте mask в конце.

s.astype(str).str.strip().mask(s.isna())

0      1
1    NaN
2    abc
3    2.0
4    def
dtype: object
...