#python #pandas
#питон #панды
Вопрос:
Как я могу вычислить количество столбцов, если df
между некоторыми столбцами есть пробел? Я создаю df
на основе XLS-файла, в котором есть такая проблема. Количество пустых столбцов неизвестно, но никогда не превышает 20.
df =
col1 col2 col3 col4
112 ret 56 xx
34 wet 45 yy
Как я могу рассчитать количество столбцов:
* чтобы получить 4 столбца (без учета пустого)
* чтобы получить 5 столбцов (учитывая пустой).
Этот подход должен работать с любым количеством пустых столбцов между непустыми столбцами.
Обновить:
Фрейм данных pandas df
создается следующим образом:
f_path = "C://test/myfile_with_blank_columns.xls"
df = pd.read_excel(open(f_path,'rb'), sheet_name='goal')
Образец данных (некоторые файлы не содержат заголовков):
0 0 24.1 23.9 24.4 24.3 2.880136
0 0 24.1 23.9 24.4 24.3 2.878689
0 0 24.1 23.9 24.4 24.3 2.875072
0 0 24.1 23.9 24.4 24.3 2.883029
Комментарии:
1. у пустого столбца даже нет имени?
2. @MohitMotwani: Верно, это проблема исходных данных, которые я не могу изменить.
3. Вам нужно предоставить способ построения этого фрейма данных, чтобы мы могли понять проблему.
4. Смотрите мой ответ ниже: пожалуйста, предоставьте дополнительные разъяснения по пустым столбцам.
5. @FChm: Пожалуйста, ознакомьтесь с моим обновлением.
Ответ №1:
Это зависит от того, как отформатированы пустые столбцы. Например, рассмотрим случай, когда они являются пустыми строками:
df = pd.DataFrame({'A': [1,2,3],
'' : ['','',''],
'B': [1,2,3]})
Вариант 1:
Вы могли бы попробовать что-то вроде подсчета количества пустых столбцов:
df_columns = list(df.columns)
num_cols = len(df_columns) - df_columns.count('')
print(num_cols)
# returns 2
Вариант 2:
Другой вариант — использовать .isidentifier()
строковый метод, это будет немного более надежным, поскольку он будет обнаруживать как пустые строки, так и пробелы в виде пустых столбцов. Однако он будет отфильтровывать любые столбцы с пробелом в! Так что это снова будет работать, только если у вас есть красиво отформатированные имена столбцов для ваших непустых столбцов.
num_cols = np.sum([col.isidentifier() for col in df.columns])
print(num_cols)
# prints 2
Комментарии:
1. Извините, но вариант 1 у меня не работает. Пожалуйста, ознакомьтесь с моим обновлением, чтобы увидеть пример данных.
2. col.isidentifier() нужен заголовок, верно? Я не сказал, что извините, некоторые файлы не содержат заголовков.
3. Я распечатал
df_columns
. Действительно, пустые столбцы получают имена'Unnamed: 89', 'Unnamed: 90', 'Unnamed: 91', 'Unnamed: 92', 'Unnamed: 93', 'Unnamed: 94'
Ответ №2:
Вот простое решение
dff = pd.read_excel('D:/test.xlsx',sheet_name='goal',header=None, na_values=' ') #This will convert blank values to NaN
dff
0 1 2 3 4 5 6 7 8 9
0 0 0 24.1 23.9 24.4 24.3 NaN NaN NaN 2.880136
1 0 0 24.1 23.9 24.4 24.3 NaN NaN NaN 2.878689
2 0 0 24.1 23.9 24.4 24.3 NaN NaN NaN 2.875072
3 0 0 24.1 23.9 24.4 24.3 NaN NaN NaN 2.883029
Получить столбцы (без учета пустого)
col = list(dff.drop(dff.loc[:,list((100*(dff.isnull().sum()/len(dff.index))==100))].columns, 1).columns.values)
print(col)
# [0, 1, 2, 3, 4, 5, 9]
print(len(col))
# 7
Получить столбцы (с учетом пустого)
all_col = dff.columns.tolist()
print(all_col)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(len(all_col))
# 10
Примечание: вы можете создать отдельный фрейм данных без пустых столбцов
df1 = dff[col]
df1
0 1 2 3 4 5 9
0 0 0 24.1 23.9 24.4 24.3 2.880136
1 0 0 24.1 23.9 24.4 24.3 2.878689
2 0 0 24.1 23.9 24.4 24.3 2.875072
3 0 0 24.1 23.9 24.4 24.3 2.883029