簡體   English   中英

Pandas 如果只有第一列有數據,則刪除行

[英]Pandas drop rows if only first column has data

我有一個 pandas dataframe 像這樣:

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

因此,為了清理這些數據,我首先要刪除只有第一列有數據的所有行,並且 rest 所有列都是 NaN。 所以我的 dataframe 會變成這樣:

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

然后將第一行作為列名並刪除它的任何進一步出現,所以最后我的 dataframe 應該是這樣的:

id        name      .... year
.
.
.

您可以使用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

您可以使用groupby拆分 DataFrame ,設置列並刪除不必要的行,然后將所有內容加入您需要的 DataFrame 中。 跨行檢查isnull()並取 cumsum 以形成組。

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

我終於能夠使用以下代碼解決它:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM