Я хотел бы отформатировать кучу чисел в списке. Самый простой способ сделать это - сначала преобразовать его в набор строк. Вот пример того, как я это делаю:
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']
Как бы я поступил с этими двумя?






попробуйте использовать fillna ()
df[col_name].fillna('').astype('str').tolist()
Да, ты можешь. Это действительно зависит от того, чем вы хотите заниматься позже.
@ David542 fillna (None) не работает, потому что разработчики не предполагали, что им потребуется обрабатывать заполнение нулевых значений другим типом нулевого значения :-)
Вы можете попробовать удалить значения 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)
спасибо, вот что я в итоге сделал. Вы тоже можете использовать
.fillna(None)? Или это должно быть строковое значение?