Saya memiliki beberapa output dalam bentuk:
count id type
588 10 | 3
10 12 | 3
883 14 | 3
98 17 | 3
17 18 | 1
77598 18 | 3
10000 21 | 3
17892 2 | 3
20000 23 | 3
63 27 | 3
6 3 | 3
2446 35 | 3
14 4 | 3
15 4 | 1
253 4 | 2
19857 4 | 3
1000 5 | 3
...
Yang cukup berantakan dan perlu dibersihkan hingga CSV sehingga saya bisa memberikannya kepada Manajer Proyek untuk mereka spreadsheet sih.
Inti dari masalahnya adalah ini: Saya perlu hasil ini:
id, sum_of_type_1, sum_of_type_2, sum_of_type_3
Contoh dari ini adalah id "4":
14 4 | 3
15 4 | 1
253 4 | 2
19857 4 | 3
Ini seharusnya menjadi:
4,15,253,19871
Sayangnya saya cukup sampah pada hal-hal semacam ini, saya sudah berhasil membersihkan semua baris dan masuk ke CSV tetapi saya belum dapat menduplikasi dan mengelompokkan baris. Sekarang saya punya ini:
awk 'BEGIN{OFS=",";} {split($line, part, " "); print part[1],part[2],part[4]}' | awk '{ gsub (" ", "", $0); print}'
Tetapi yang dilakukan hanyalah membersihkan karakter sampah dan mencetak baris lagi.
Apa cara terbaik untuk memijat baris ke dalam output yang disebutkan di atas?
Jawaban:
Cara untuk melakukannya adalah dengan meletakkan segala sesuatu di dalam hash.
sunting: jawaban pertama saya tidak menjawab pertanyaan dengan benar
sumber
NF<4{$4="no_type";}
di awalPerl untuk penyelamatan:
Itu membuat dua tabel, tabel jenis dan tabel id. Untuk setiap id, ia menyimpan jumlah per jenis.
sumber
Jika datamash GNU adalah opsi untuk Anda, maka
sumber
Python (dan
pandas
perpustakaan khususnya sangat cocok untuk jenis pekerjaan iniIni membaca data csv ke a
pandas DataFrame
Lalu kami mengelompokkan data ini dengan
id
, dan mengambil jumlah kolomcount
The
unstack
membentuk ulang ini untuk memindahkan id ini ke kolom, danfillna
mengisi bidang kosong dengan 0 iniIni kembali
Karena kerangka data berisi data yang hilang (kombinasi tipe-id kosong), panda mengubah
int
s menjadifloat
(batasan kerja internal) Jika Anda tahu input hanya akan menjadi int, Anda dapat mengubah baris berikutnya ke terakhir kedf_sum = df.groupby(('type', 'id'))['count'].sum().unstack('type').fillna(0).astype(int)
sumber
Anda dapat menggunakan Perl untuk mengulangi file CSV dan mengumpulkan jumlah dari tipe yang sesuai dalam hash saat dalam perjalanan. Dan pada akhirnya, tampilkan informasi yang dikumpulkan untuk setiap ID.
Struktur data
Ini membantu dalam memahami kode di bawah ini:
Perl
Keluaran
sumber
pendapat saya, tidak terlalu berbeda dari yang lain. Menggunakan awk GNU yang memiliki array array
output
sumber
Anda dapat menggunakan kode ini untuk meringkas nilai berdasarkan kolom id Anda,
Saya telah menambahkan satu pernyataan awk setelah kode Anda
Silakan dengan ini ...
sumber