繁体   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