Как рассчитать количество столбцов с учетом промежуточных пустых столбцов?

#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