Saya punya file txt dengan data dalam format ini. 3 baris pertama ulangi berulang kali.
name=1
grade=A
class=B
name=2
grade=D
class=A
Saya ingin menampilkan data dalam format tabel, misalnya:
name | grade | class
1 | A | B
2 | D | A
Saya berjuang untuk mengatur header dan hanya mengulang data. Apa yang saya coba sejauh ini adalah:
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)
Output dari itu adalah
+-------+-----+
| 0 | 1 |
|-------+-----|
| name | 1 |
| grade | A |
| class | B |
| name | 2 |
| grade | D |
| class | A |
+-------+-----+
Tidak benar-benar apa yang saya cari.
df = pd.read_table(file, header=None)
, buat baris berikutnew = df[0].str.split("=", n=1, expand=True)
, dan ini akan menjadi jawaban favorit saya dalam hal "kode yang bagus".%timeit
jawaban saya dan terkejut betapa lambatnya solusi pure-panda. Itu sekitar x7 lebih lambat pada mesin saya (untuk file txt input sangat kecil)! Dengan kenyamanan datang di atas kepala, dengan overhead (sebagian besar waktu) datang hilangnya kinerja ...Saya tahu Anda memiliki jawaban yang cukup, tetapi berikut cara lain menggunakan kamus:
Ini memberi Anda output sebagai:
Hanya untuk mendapatkan perspektif lain.
sumber
Karena Anda sudah mendapatkan hasil, inilah cara saya menangani masalahnya:
Pertama buat indeks unik berdasarkan pengulangan kolom,
kami kemudian menggunakan ini untuk memutar bingkai data Anda menggunakan
crosstab
fungsisumber
Yang juga bisa Anda lakukan adalah membaca file teks Anda
file
di blok 3, membuat daftar bersarang, dan memasukkannya ke dalam kerangka data:df
akan langsung menjadiCatatan # 1: Meskipun ini membuat lebih banyak baris kode daripada
pandas
solusi murni , menurut pengalaman saya, ini cenderung lebih efisien karena menggunakan lebih sedikitpandas
fungsi sehingga lebih sedikit overhead.Catatan # 2: Secara umum saya berpendapat bahwa akan lebih baik untuk menyimpan data input Anda dalam format lain, misalnya
json
ataucsv
. itu akan membuatnya jauh lebih mudah dibaca, misalnya denganpandas
fungsi read_csv dalam kasus file csv.sumber
Anda dapat menghasilkan output dengan menggunakan modul Kamus Python dan Pandas.
Pendekatan ini mungkin bukan yang paling efisien tetapi tidak menggunakan salah satu fungsi canggih Pandas. Semoga ini bisa membantu.
Hasil:
sumber
IMHO, semua jawaban saat ini terlihat terlalu rumit. Apa yang akan saya lakukan, adalah menggunakan
'='
sebagaisep
parameterpd.read_csv
untuk membaca 2 kolom, dan kemudianpivot
DataFrame yang diperoleh:Jika Anda tidak ingin indeks kolom multi-level dalam hasil, Anda dapat menghapusnya dengan:
sumber