Saya memiliki kerangka data panda seperti:

Unnamed:1 Unnamed:2 .... Unnamed:20
Data      NaN       .... NaN
id        name      .... year
.
.
.
Data2     NaN       .... NaN
id        name      .... year
.
.
.
Footnotes NaN       .... NaN

Jadi, untuk membersihkan data ini, pertama-tama saya ingin menghapus semua baris di mana hanya kolom pertama yang memiliki data dan sisanya semua kolom adalah NaN. Jadi kerangka data saya akan menjadi seperti ini:

Unnamed:1 Unnamed:2 .... Unnamed:20
id        name      .... year
.
.
.
id        name      .... year
.
.
.

Kemudian buat baris pertama sebagai nama kolom dan jatuhkan kemunculannya lebih lanjut dan akhirnya kerangka data saya harus seperti ini:

id        name      .... year
.
.
.
-1
Ank 4 Januari 2021, 20:15

3 jawaban

Jawaban Terbaik

Saya akhirnya bisa menyelesaikannya menggunakan kode di bawah ini:

col1 = df.iloc[:, 0]
temp = df.iloc[:, 1:]
temp = temp.dropna(axis=0, how='all')
df = pd.merge(pd.DataFrame(col1), temp, left_index=True, right_index=True, how='inner')
df = df.drop_duplicates()
df.columns = df.iloc[0]
df = df.drop(df.index[0]).reset_index(drop=True)
0
Ank 5 Januari 2021, 13:29

Anda dapat menggunakan startswith:

# cache the id rows
second_row = df.iloc[1].values

# data rows
data_rows = df.iloc[:,0].str.startswith('Data')

# id rows
id_rows = df.iloc[:,0].eq('id')
# or might be better
# id_rows = df.eq(second_row).all(1)

# drop those rows
df = df[ ~(data_rows | id_rows)]

# rename columns
df.columns = second_row
1
Quang Hoang 4 Januari 2021, 17:31

Anda dapat membagi DataFrame dengan groupby, mengatur kolom dan membuang baris yang tidak perlu, lalu menggabungkan semuanya ke dalam DataFrame yang Anda butuhkan. Centang isnull() di seberang baris dan ambil cumsum untuk membentuk grup.

print(df)
  Unnamed:1 Unnamed:2 Unnamed:20
0      Data       NaN        NaN
1        id      name       year
2       id1     name1      year1
3     Data2       NaN        NaN
4        id      name       year
5       id2     name2      year2
6       id3     name3      year3

l = []
for idx, gp in df.groupby(df.iloc[:, 1:].isnull().all(1).cumsum()):
    gp.columns = gp.iloc[1, :]   # Set columns
    gp = gp.iloc[2:]             # Remove Unnamed and col name rows
    l.append(gp)

res = pd.concat(l, ignore_index=True)
#    id   name   year
#0  id1  name1  year1
#1  id2  name2  year2
#2  id3  name3  year3
0
ALollz 4 Januari 2021, 17:25