Mam plik txt z danymi w tym formacie. Pierwsze 3 linie powtarzają się w kółko.
name=1
grade=A
class=B
name=2
grade=D
class=A
Chciałbym wyprowadzić dane w formacie tabeli, na przykład:
name | grade | class
1 | A | B
2 | D | A
Próbuję ustawić nagłówki i po prostu zapętlić dane. Do tej pory próbowałem:
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)
Wynik z tego jest
+-------+-----+
| 0 | 1 |
|-------+-----|
| name | 1 |
| grade | A |
| class | B |
| name | 2 |
| grade | D |
| class | A |
+-------+-----+
Nie do końca to, czego szukam.
df = pd.read_table(file, header=None)
, zrób następujący wiersznew = df[0].str.split("=", n=1, expand=True)
, a to byłaby moja ulubiona odpowiedź pod względem „ładnego kodu”.%timeit
moją odpowiedź i dowiedziałem się, jak wolne jest rozwiązanie czystej pandy. Na moim komputerze było około x7 wolniej (dla bardzo małego wejściowego pliku txt)! Z wygody przychodzi nad głową, zWiem, że masz wystarczająco dużo odpowiedzi, ale oto inny sposób zrobienia tego za pomocą słownika:
To daje wynik jako:
Aby uzyskać inną perspektywę.
źródło
Ponieważ otrzymałeś wynik, w ten sposób poradziłbym sobie z problemem:
Najpierw utwórz unikalny indeks oparty na powtarzalności kolumn,
następnie wykorzystujemy to do przestawienia ramki danych za pomocą
crosstab
funkcjiźródło
Możesz także przeczytać
file
plik tekstowy w blokach po 3, zbudować zagnieżdżoną listę i umieścić ją w ramce danych:df
byłoby bezpośrednioUwaga nr 1: Chociaż powoduje to powstanie większej liczby wierszy kodu niż czyste
pandas
rozwiązanie, z mojego doświadczenia wynika, że może być bardziej wydajne, ponieważ korzysta z mniejszej liczbypandas
funkcji, a tym samym mniejszego obciążenia.Uwaga 2: Ogólnie twierdzę, że lepiej byłoby przechowywać dane wejściowe w innym formacie, np .
json
Lubcsv
. znacznie ułatwiłoby to czytanie, na przykład dziękipandas
funkcji read_csv w przypadku pliku csv.źródło
Możesz wygenerować ten wynik, używając modułu słownika Python i Pand.
To podejście może nie być najskuteczniejsze, ale nie wykorzystuje żadnej z zaawansowanych funkcji Pand. Mam nadzieję, że to pomoże.
Wyjście:
źródło
IMHO, wszystkie obecne odpowiedzi wyglądają na zbyt skomplikowane. Chciałbym użyć
'='
jakosep
parametrupd.read_csv
odczytu 2 kolumn, a następniepivot
uzyskanej DataFrame:Jeśli nie chcesz w wyniku tego indeksu kolumn wielopoziomowych, możesz go usunąć poprzez:
źródło