为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Python/Pandas 清除 Dataframe 中的错误标头

使用 Python/Pandas 清除 Dataframe 中的错误标头

慕丝7291255 2022-05-19 14:30:18
我有一个损坏的数据帧,其中数据帧内有随机标题重复。加载数据框时如何忽略或删除这些行?由于这个随机头在数据框中,熊猫在加载时会引发错误。我想在用熊猫加载它时忽略这一行。或者在用熊猫加载它之前以某种方式删除它。该文件如下所示:col1, col2, col30, 1, 10, 0, 01, 1, 1col1, col2, col3  <- this is the random copy of the header inside the dataframe0, 1, 10, 0, 01, 1, 1我想:col1, col2, col30, 1, 10, 0, 01, 1, 10, 1, 10, 0, 01, 1, 1
查看完整描述

2 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

投入na_filter = False以将您的列类型转换为字符串。然后找到所有包含错误数据的行,然后将它们过滤掉您的数据框。


>>> df = pd.read_csv('sample.csv', header = 0, na_filter = False)

>>> df

   col1  col2  col3

0     0     1     1

1     0     0     0

2     1     1     1

3  col1  col2  col3

4     0     1     1

5     0     0     0

6     1     1     1

>>> type(df.iloc[0,0])

<class 'str'>

现在您已将每列中的数据解析为字符串,找到col1, col2, and col3df 中的所有值,如果您在每列中找到它们,则创建一个新列np.where(),如下所示:


>>> df['Tag'] = np.where(((df['col1'] != '0') & (df['col1'] != '1')) & ((df['col2'] != '0') & (df['col2'] != '1')) & ((df['col3'] != '0') & (df['col3'] != '1')), ['Remove'], ['Don\'t remove'])

>>> df

   col1  col2  col3           Tag

0     0     1     1  Don't remove

1     0     0     0  Don't remove

2     1     1     1  Don't remove

3  col1  col2  col3        Remove

4     0     1     1  Don't remove

5     0     0     0  Don't remove

6     1     1     1  Don't remove

现在,使用 过滤掉列中标记为Removed的那个。Tagisin()


>>> df2 = df[~df['Tag'].isin(['Remove'])]

>>> df2

  col1 col2 col3           Tag

0    0    1    1  Don't remove

1    0    0    0  Don't remove

2    1    1    1  Don't remove

4    0    1    1  Don't remove

5    0    0    0  Don't remove

6    1    1    1  Don't remove

删除Tag列:


>>> df2 = df2[['col1', 'col2', 'col3']]

>>> df2

  col1 col2 col3

0    0    1    1

1    0    0    0

2    1    1    1

4    0    1    1

5    0    0    0

6    1    1    1

最后将您的数据帧类型转换为 int,如果您需要它是整数:


>>> df2 = df2.astype(int)

>>> df2

   col1  col2  col3

0     0     1     1

1     0     0     0

2     1     1     1

4     0     1     1

5     0     0     0

6     1     1     1

>>> type(df2['col1'][0])

<class 'numpy.int32'>

注意:如果您想要标准索引,请使用:


>>> df2.reset_index(inplace = True, drop = True)

>>> df2

   col1  col2  col3

0     0     1     1

1     0     0     0

2     1     1     1

3     0     1     1

4     0     0     0

5     1     1     1


查看完整回答
反对 回复 2022-05-19
?
BIG阳

TA贡献1859条经验 获得超6个赞

您只需要执行以下操作:

假设df_raw您的原始数据框具有列标题作为列名并在其他几行中重复,则您更正的数据框是df.


# Filter out only the rows without the headers in them.

headers = df_raw.columns.tolist()

df = df_raw[df_raw[headers[0]]!=headers[0]].reset_index(drop=True)

假设:

- 我们假设第一列标题的出现意味着必须删除该行。


现在详细

介绍一个详细的代码块,任何人都可以

- 创建数据,

- 将其写入 csv 文件,

- 将其作为数据帧加载,然后

- 删除作为标题的行。


import numpy as np

import pandas as pd


# make a csv file to load as dataframe

data = '''col1, col2, col3

0, 1, 1

0, 0, 0

1, 1, 1

col1, col2, col3

0, 1, 1

0, 0, 0

1, 1, 1'''

# Write the data to a csv file

with open('data.csv', 'w') as f:

    f.write(data)

# Load your data with header=None

df_raw = pd.read_csv('data.csv', header=None)


# Declare which row to find the header data: 

#    assuming the top one, we set this to zero.

header_row_number = 0


# Read in columns headers

headers = df_raw.iloc[header_row_number].tolist()


# Set new column headers

df_raw.columns = headers


# Filter out only the rows without the headers in them

# We assume that the appearance of the 

# first column header means that row has to be dropped

# And reset index (and drop the old index column)

df = df_raw[df_raw[headers[0]]!=headers[0]].reset_index(drop=True)

df

//img1.sycdn.imooc.com//6285e432000106b816130934.jpg

查看完整回答
反对 回复 2022-05-19
  • 2 回答
  • 0 关注
  • 470 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号