Обратите внимание, что подобная проблема может вас укусить, если вы используете os.path.join()
для включения расширения, которое уже содержит точку, что происходит автоматически, когда вы используете os.path.splitext()
. В этом примере:
components = os.path.splitext(filename)
prefix = components[0]
extension = components[1]
return os.path.join("avatars", instance.username, prefix, extension)
Хотя extension
может быть .jpg
, вы получите папку с именем «foobar», а не файл «foobar.jpg». Чтобы этого не произошло, вам необходимо добавить расширение отдельно:
return os.path.join("avatars", instance.username, prefix) + extension
Ответ: Используйте строковый буфер (пакет io), чтобы загрузить объект, возвращенный .info (). После загрузки базовые операции с Python могут дать вам то, что вам нужно.
Код:
# Buffer functionality
import io
# Regular expression functionality
import re
buffer = io.StringIO()
df.info(buf=buffer)
# If you look at the output, the first 3 lines and the last 2 lines describe the output. There will be one trailing '' (hence -3).
# Shrink multiple spaces into one space, to be guaranteed that each split value is as such: split_arr[0] == column_name, split_arr[1] == non_null_count
tuple_array = [
(re.sub(' +', ' ', val).split(' ')[0], re.sub(' +', ' ', val).split(' ')[1])
for val in buffer.getvalue().split('\n')[3:-3]
]
Вывод: Вывод из приведенного выше примера DataFrame будет выглядеть следующим образом. Обратите внимание, что этот код может быть применен к любому вызову df.info()
.
tuple_array = [
('a', '2'),
...
('b', '4')
]
Использование pd.DataFrame.isnull
с pd.Series.items
:
df = pd.DataFrame({'a': [1, np.nan, 2, np.nan],
'b': [1, 5, 6, 6]})
res = list(df.isnull().sum().items())
# [('a', 2), ('b', 0)]