如果只有第一列有数据,则删除行

2024-05-31 23:41:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据框,如下所示:

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

因此,为了清理这些数据,我首先要删除只有第一列有数据的所有行,其余所有列都是NaN。因此,我的数据帧将变成这样:

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

然后将第一行作为列名,并删除它的任何进一步出现,因此最后我的数据帧应如下所示:

id        name      .... year
.
.
.

Tags: 数据nameiddatananyeardata2footnotes
3条回答

我终于能够用下面的代码解决它:

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)

您可以使用groupby将数据框拆分,设置列并删除不必要的行,然后将所有内容连接到所需的数据框中。检查行中的isnull(),并取总和以形成组

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

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

相关问题 更多 >