#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]