![](/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.