У меня есть текстовый файл с данными в этом формате. Первые 3 строки повторяются снова и снова.
name=1
grade=A
class=B
name=2
grade=D
class=A
Я хотел бы вывести данные в виде таблицы, например:
name | grade | class
1 | A | B
2 | D | A
Я изо всех сил пытаюсь установить заголовки и просто перебрать данные. Что я пробовал до сих пор:
def myfile(filename):
with open(file1) as f:
for line in f:
yield line.strip().split('=',1)
def pprint_df(dframe):
print(tabulate(dframe, headers="keys", tablefmt="psql", showindex=False,))
#f = pd.DataFrame(myfile('file1')
df = pd.DataFrame(myfile('file1'))
pprint_df(df)
Выход из этого
+-------+-----+
| 0 | 1 |
|-------+-----|
| name | 1 |
| grade | A |
| class | B |
| name | 2 |
| grade | D |
| class | A |
+-------+-----+
Не совсем то, что я ищу.
df = pd.read_table(file, header=None)
, сделайте следующую строкуnew = df[0].str.split("=", n=1, expand=True)
, и это будет мой любимый ответ с точки зрения «хороший код».%timeit
свой ответ и был удивлен, насколько медленным является решение для чистых панд. На моей машине это было примерно в 7 раз медленнее (для очень маленького входного текстового файла)! С удобством приходит накладные расходы, с накладными (в большинстве случаев) идет потеря производительности ...Я знаю, что у вас достаточно ответов, но вот еще один способ сделать это с помощью словаря:
Это дает вам вывод как:
Просто чтобы получить другую перспективу.
источник
Поскольку у вас есть выход, вот как я бы справился с проблемой:
Сначала создайте уникальный индекс, основанный на повторяемости столбцов,
Затем мы используем это, чтобы повернуть ваш фрейм данных с помощью
crosstab
функцииисточник
То, что вы также можете сделать, это прочитать ваш текстовый файл
file
в блоках по 3, построить вложенный список и поместить его в фрейм данных:df
будет непосредственноПримечание № 1: Хотя это приводит к большему количеству строк кода, чем к чистому
pandas
решению, по моему опыту, оно, вероятно, будет более эффективным, так как использует меньшеpandas
функций и, следовательно, меньше накладных расходов.Примечание № 2: В общем, я бы сказал, что было бы лучше сохранить ваши входные данные в другом формате, например
json
илиcsv
. это облегчит чтение, например, с помощьюpandas
функции read_csv в случае csv-файла.источник
Вы можете сгенерировать этот вывод, используя модуль Python's Dictionary и Pandas.
Этот подход может быть не самым эффективным, но он не использует ни одной из продвинутых функций панд. Надеюсь, поможет.
Выход:
источник
ИМХО, все текущие ответы выглядят слишком сложными. Что я хотел бы сделать, это использовать
'='
в качествеsep
параметраpd.read_csv
для чтения 2 столбцов, а затемpivot
полученный DataFrame:Если вам не нужен этот многоуровневый индекс столбца в результате, вы можете удалить его:
источник