Pandas Dataframe

Oct 31 2020

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

2 jezrael Oct 31 2020 at 13:48

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
sharathnatraj Oct 31 2020 at 14:19

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
CodePerfectPlus Oct 31 2020 at 14:46

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