![](/img/trans.png)
[英]Drop a group of rows if one column has missing data in a pandas dataframe
[英]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.