Pandas Dataframe
Saya memiliki dataframe yang berisi sejumlah kolom dan baris, di semua kolom kecuali dua paling kiri, ada data dalam bentuk "integer-integer". Saya ingin membagi semua kolom ini menjadi dua kolom, dengan setiap bilangan bulat di selnya sendiri, dan menghapus tanda hubung.
Saya telah mencoba mengikuti jawaban di Pandas Dataframe: Pisahkan beberapa kolom masing-masing menjadi dua kolom , tetapi tampaknya mereka membelah setelah satu elemen, sementara saya ingin membagi di "-".
Sebagai contoh, misalkan saya memiliki kerangka data dalam bentuk:
Saya ingin membagi kolom berlabel 2 hingga 22, agar disebut 2F, 2A, 3F, 3A, ..., 6A dengan data di baris pertama adalah R1, Hawthorn, 229, 225, 91, 81, ..., 12.
Terima kasih atas bantuannya.
Jawaban
Anda dapat menggunakan DataFrame.set_indexdengan DataFrame.stackfor Series, kemudian membagi ke 2 kolom baru dengan Series.str.split, mengkonversi ke bilangan bulat, membuat nama kolom baru dengan DataFrame.set_axis, membentuk kembali DataFrame.unstack, mengurutkan kolom berdasarkan DataFrame.sort_indexdan terakhir rata MultiIndexdengan mengkonversi indeks ke kolom dengan DataFrame.reset_index:
#first replace columns names to default values
df.columns = range(len(df.columns))
df = (df.set_index([0,1])
.stack()
.str.split('-', expand=True)
.astype(int)
.set_axis(['F','A'], axis=1, inplace=False)
.unstack()
.sort_index(axis=1, level=[1,0], ascending=[True, False]))
df.columns = df.columns.map(lambda x: f'{x[1]}{x[0]}')
df = df.reset_index()
print (df)
0 1 2F 2A 3F 3A 4F 4A 5F 5A 6F 6A
0 R1 Hawthorn 229 225 91 81 216 142 439 367 7 12
1 R2 Sydney 226 214 93 92 151 167 377 381 12 8
2 R3 Geelong 216 228 91 166 159 121 369 349 16 14
3 R4 North Melbourne 213 239 169 126 142 155 355 394 8 9
4 R5 Gold Coast 248 226 166 94 267 169 455 389 18 6
5 R6 St Kilda 242 197 118 161 158 156 466 353 15 16
6 R7 Fremantle 225 219 72 84 224 185 449 464 7 5
Untuk Input:
df = pd.DataFrame({0: ['R1'], 1: ['Hawthorn'], 2: ['229-225'], 3: ['91-81'], 4:['210-142'], 5:['439-367'], 6:['7-12']})
0 1 2 3 4 5 6
0 R1 Hawthorn 229-225 91-81 210-142 439-367 7-12
Mencoba kode:
for i in df.columns[2::]:
df[[str(i)+'F', str(i)+'A']] =pd.DataFrame(df[i].str.split('-').tolist(), index= df.index)
del df[i]
Cetakan (baris ke-1):
0 1 2F 2A 3F 3A 4F 4A 5F 5A 6F 6A
0 R1 Hawthorn 229 225 91 81 210 142 439 367 7 12
Anda dapat menggunakan fungsi lambda untuk membagi seri
import pandas as pd
df = pd.read_csv("data.csv")
df.head()
>>> data
0 12-24
1 13-26
2 14-28
3 15-30
df["d1"] = df["data"].apply(lambda x: x.split("-")[0])
df["d2"] = df["data"].apply(lambda x: x.split("-")[1])
df.head()
>>>
data d1 d2
0 12-24 12 24
1 13-26 13 26
2 14-28 14 28
3 15-30 15 30