Преобразовать столбец в строку, сохранив NaN (как None или пустое)

Я хотел бы отформатировать кучу чисел в списке. Самый простой способ сделать это - сначала преобразовать его в набор строк. Вот пример того, как я это делаю:

df[col_name].astype('str').tolist()

Однако проблема в том, что я получаю такие значения, как:

['12.19', '13.99', '1.00', 'nan', '9.00']

Есть ли способ вернуть значения 'nan' как None или как пустую строку, например:

['12.19', '13.99', '1.00', None, '9.00']

Или:

['12.19', '13.99', '1.00', '', '9.00']

Как бы я поступил с этими двумя?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
0
3 655
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

попробуйте использовать fillna ()

df[col_name].fillna('').astype('str').tolist()

спасибо, вот что я в итоге сделал. Вы тоже можете использовать .fillna(None)? Или это должно быть строковое значение?

David542 23.12.2018 06:23

Да, ты можешь. Это действительно зависит от того, чем вы хотите заниматься позже.

Hainan Zhao 23.12.2018 06:33

@ David542 fillna (None) не работает, потому что разработчики не предполагали, что им потребуется обрабатывать заполнение нулевых значений другим типом нулевого значения :-)

cs95 23.12.2018 06:33

Вы можете попробовать удалить значения nan после создания списка.

list = ["nan","1.27"]
for x in range(len(list)):
    if list[x] == "nan":
        list[x] = None # Or list[x] = ""

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

.isalpha() будет работать:

l = ['12.19', '13.99', '1.00', 'nan', '9.00']
print([None if i.isalpha() else i for i in l])

['12.19', '13.99', '1.00', None, '9.00']

Это уникальное требование, и я считаю, что лучше всего ответить на него, составив список:

df[col_name]
0    12.19
1    13.99
2     1.00
3      NaN
4     9.00
dtype: float64

[str(v_) if pd.notna(v_) else None for v_ in df[col_name]]
# ['12.19', '13.99', '1.0', None, '9.0'] 

Если вы предпочитаете, чтобы значения были заполнены как пробелы, это не менее просто:

[str(v_) if pd.notna(v_) else '' for v_ in df[col_name]]
# ['12.19', '13.99', '1.0', '', '9.0'] 

Вы можете сделать это:

df[col_name].fillna('').astype('str').tolist()

ИЛИ

l = df[col_name].astype('str').tolist()

Замените пустые элементы из созданного выше списка на None:

list(map(lambda x: float(x) if x else None, l))
Ответ принят как подходящий

Вы можете попробовать вот так.

1st way:

>>> df[col_name].apply(lambda v: str(v) if str(v) != 'nan' else None).tolist()
['12.19', '13.99', '1.00', None, '9.00']
>>>
>>> df[col_name].apply(lambda v: str(v) if str(v) != 'nan' else '').tolist()
['12.19', '13.99', '1.00', '', '9.00']
>>>

2nd way:

>>> df[col_name].apply(lambda v: str(v) if not pd.isnull(v) else None).tolist()
['12.19', '13.99', '1.00', None, '9.00']
>>>
>>> df[col_name].apply(lambda v: str(v) if not pd.isnull(v) else '').tolist()
['12.19', '13.99', '1.00', '', '9.00']
>>>

Вот подробное объяснение.

>>> import pandas as pd
>>> import numpy as np
>>>
>>> df = pd.DataFrame({
... "fullname": ['P Y', 'P T', 'T Y', 'N A', 'P Z'],
... "age": [36, 80, 25, 8, 34],
... "salary": ['12.19', '13.99', '1.00', np.nan, '9.00']
... })
>>>
>>> df
  fullname  age salary
0      P Y   36  12.19
1      P T   80  13.99
2      T Y   25   1.00
3      N A    8    NaN
4      P Z   34   9.00
>>>
>>> # PROBLEM
...
>>> col_name = "salary"
>>> df[col_name].astype("str").tolist()
['12.19', '13.99', '1.00', 'nan', '9.00']
>>>
>>> # SOLUTION
...
>>> df[col_name].apply(lambda v: str(v) if str(v) != 'nan' else None)
0    12.19
1    13.99
2     1.00
3     None
4     9.00
Name: salary, dtype: object
>>>
>>> df[col_name].apply(lambda v: str(v) if str(v) != 'nan' else '')
0    12.19
1    13.99
2     1.00
3
4     9.00
Name: salary, dtype: object
>>>
>>> df[col_name].apply(lambda v: str(v) if str(v) != 'nan' else None).tolist()
['12.19', '13.99', '1.00', None, '9.00']
>>>
>>> df[col_name].apply(lambda v: str(v) if str(v) != 'nan' else '').tolist()
['12.19', '13.99', '1.00', '', '9.00']
>>>
>>> df[col_name].apply(lambda v: str(v) if not pd.isnull(v) else None).tolist()
['12.19', '13.99', '1.00', None, '9.00']
>>>
>>> df[col_name].apply(lambda v: str(v) if not pd.isnull(v) else '').tolist()
['12.19', '13.99', '1.00', '', '9.00']
>>>

Используйте df.astype(str, skipna=True), он пропустит все типы NA.

Пример:

import pandas as pd
df=pd.Series([12.19, 13.99, 1.00, None, 9.00])
print(df.astype(str, skipna=True).to_list())
pd.isna(df.astype(str, skipna=True))

Вывод:

['12.19', '13.99', '1.0', nan, '9.0']
0    False
1    False
2    False
3     True
4    False
dtype: bool

Если вам действительно нужен None вместо np.nan, добавьте df=df.where(pd.notnull(df), None).

Пример:

df=pd.Series([12.19, 13.99, 1.00, None, 9.00])
df=df.astype(str, skipna=True)
df=df.where(pd.notnull(df), None)
print(df.to_list())

Вывод:

['12.19', '13.99', '1.0', None, '9.0']

Примечание: Параметр skipna исчез из .astype() в версии pandas 1.0, и проблема в настоящее время открыта по состоянию на 06.02.2020.

astype (str) / astype_unicode: np.nan преобразован в nan (checknull, skipna)

Series.astype (str, skipna = True) исчез в версии 1.0

Другие вопросы по теме