Есть ли способ получить индексные номера столбцов фрейма данных на основе того, что находится в заголовке?

#python #pandas

Вопрос:

Я хочу создать фрейм данных, содержащий столбцы с буквой » X » над ними в заголовке, но я не могу найти способ получить номера индексов столбцов.

Я бы выбрал правильный фрейм данных, как только у меня будут номера индексов столбцов.

 df_right_columns = df_right_column[df_right_column.columns[column_numbers]]  

Образец df:

 df = pd.DataFrame({'X': ['column1', 'cell 1', 'cell 2', 'cell 3', 'cell 4'],  'X': ['column2', 'cell 2', 'cell 3', 'cell 4', 'cell 6'],  '': ['column3', 'cell 3', 'cell 4', 'cell 5', 'cell 7'],  'X': ['column4', 'cell 4', 'cell 5', 'cell 6', 'cell 8']})    X X X column1 column2 column3 column4 cell 1 cell 2 cell 3 cell 4 cell 2 cell 3 cell 4 cell 5 cell 3 cell 4 cell 5 cell 6 cell 4 cell 5 cell 6 cell 7 cell 5 cell 6 cell 7 cell 8  

Я попытался запустить этот фрейм данных через цикл for, чтобы попытаться получить номера индексов, но до сих пор мне не везло. Я сделал это, 1) найдя строку заголовка X, 2) пропустив эту строку через цикл for, чтобы проверить столбцы, содержащие » X » в строке df.iloc[0].

 df = df.iloc[0]  for cell in df:  if 'X' in cell:  print(cell.index) #this will return an object - lt;built-in method index of str object at 0x7f23be18a9b0gt;   print(cell) #this will return the cell value not the index, X in this case  

Я очень близок, и любая помощь была бы очень признательна, большое спасибо

Решение

 df = pd.DataFrame({'X': ['column1', 'cell 1', 'cell 2', 'cell 3', 'cell 4'],  'X': ['column2', 'cell 2', 'cell 3', 'cell 4', 'cell 6'],  '': ['column3', 'cell 3', 'cell 4', 'cell 5', 'cell 7'],  'X': ['column4', 'cell 4', 'cell 5', 'cell 6', 'cell 8']})  print(df)   X X X column1 column2 column3 column4 cell 1 cell 2 cell 3 cell 4 cell 2 cell 3 cell 4 cell 5 cell 3 cell 4 cell 5 cell 6 cell 4 cell 5 cell 6 cell 7 cell 5 cell 6 cell 7 cell 8  df_header = df.iloc[0]  column_number = [] i = 0 while i lt; len(df_header):  for column_index in df_header:  if 'X' in column_index:  column_number.append(i)  i  = 1  df = df[df.columns[column_number]]  print(df)   X X X column1 column2 column4 cell 1 cell 2 cell 4 cell 2 cell 3 cell 5 cell 3 cell 4 cell 6 cell 4 cell 5 cell 7 cell 5 cell 6 cell 8  

Комментарии:

1. Не могли бы вы поделиться кодом для создания экземпляра входного кадра данных? Наличие правильного индекса/столбцов довольно важно для этого вопроса.

2. Он запускается из электронной таблицы, но позвольте мне попробовать дать вам код

3. Я добавил входной код df @timgeb

Ответ №1:

Вы можете использовать мультииндекс:

 Xs = ['X', 'X', None, 'X'] df.columns = pd.MultiIndex.from_arrays([Xs, df.columns])  

или из списка должностей:

 pos = (0,1,3) Xs = ['X' if i in pos else '' for i in range(len(df.columns))] df.columns = pd.MultiIndex.from_arrays([Xs, df.columns])  

выход:

 X X NaN X  column1 column2 column3 column4 0 cell 1 cell 2 cell 3 cell 4 1 cell 2 cell 3 cell 4 cell 5 2 cell 3 cell 4 cell 5 cell 6 3 cell 4 cell 5 cell 6 cell 7 4 cell 5 cell 6 cell 7 cell 8  

вход:

 df = pd.DataFrame({'column1': ['cell 1', 'cell 2', 'cell 3', 'cell 4', 'cell 5'],  'column2': ['cell 2', 'cell 3', 'cell 4', 'cell 5', 'cell 6'],  'column3': ['cell 3', 'cell 4', 'cell 5', 'cell 6', 'cell 7'],  'column4': ['cell 4', 'cell 5', 'cell 6', 'cell 7', 'cell 8']})  

Комментарии:

1. Спасибо за решение, человек, но я использовал несколько иной способ получения индекса столбца. Я опубликую свое решение в исходном вопросе.

Ответ №2:

попробовать это:

 table = [{'a': 1, 'b': 2, 'c': 3, 'd': 4},  {'a': 100, 'b': 200, 'c': 300, 'd': 400},  {'a': 1000, 'b': 2000, 'c': 3000, 'd': 4000}]  df = pd.DataFrame(table)  print("total size row: ", df.index.size)  for value in df.values:  print("size col: ", value.size, "value:", value)  output: total size row: 3 size col: 4 value: [1 2 3 4] size col: 4 value: [100 200 300 400] size col: 4 value: [1000 2000 3000 4000]