数据清理:从具有标头和索引的数据集中删除0值_

2024-03-29 11:57:26 发布

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

我有一个数据集显示如下。你知道吗

enter image description here

我想做的是三件事。 第一步:AA到CC都是索引,不是一个实际的数据集,不过,很乐意保留在数据集中以备将来使用。 第2步:每行计数0值。 步骤3:如果行中的0大于20%,这意味着在本例中大于2,因为DD到MM是10列,请删除该行。 所以我做了一个愚蠢的方法来实现以上三个步骤。你知道吗

df = pd.read_csv("dataset.csv", header=None)
df_bool = (df == "0")
print(df_bool.sum(axis=1))

然后我得到一个预期的结果如下所示。你知道吗

0 0
1 0
2 1
3 0
4 1
5 8
6 1
7 0

因此删除了第5行,如下所示。你知道吗

df2 = df.drop([5], axis=0)
print(df2)

即使这不是一个优雅的,有点愚蠢的方式,这也很有效。 但是,如果我以header=0的形式导入数据集,那么这种方法根本不起作用。你知道吗

df = pd.read_csv("dataset.csv", header=0)

0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0

怎么会这样? 另外,如果我想写一个带有循环、计数和删除函数的代码,代码是什么样子的?你知道吗


Tags: csv数据方法代码dfread步骤dataset
2条回答

您可以继续使用^{}

首先我们计算每行的列数和零数:

n_columns = len(df.columns)  # or df.shape[1]
zeroes = (df == "0").sum(axis=1)

然后,我们只选择零小于20%的行。你知道吗

proportion_zeroes = zeroes / n_columns
max_20 = proportion_zeroes < 0.20
df[max_20]  # This will contain only rows that have less than 20 % zeroes

一行:

df[((df == "0").sum(axis=1) / len(df.columns)) < 0.2]

如果您可以发布数据框在pandas中的外观,而不是excel文件的图片,那就太好了。但是,构造一个虚拟df

 df = pd.DataFrame({'index1':['a','b','c'],'index2':['b','g','f'],'index3':['w','q','z']
              ,'Col1':[0,1,0],'Col2':[1,1,0],'Col3':[1,1,1],'Col4':[2,2,0]})

第1步,可以使用.set\u index()方法指定索引,如下所示

df.set_index(['index1','index2','index3'],inplace=True)

在数据帧过滤过程中,您可以使用从df_bool.sum(axis=1)得到的返回值,而不是手工进行过滤,如下所示

df.loc[(df==0).sum(axis=1) / (df.shape[1])>0.6]
index1  index2  index3  Col1    Col2    Col3    Col4
c       f       z       0       0       1       0

使用它你可以删除那些行,假设20%,那么你会使用

df = df.loc[(df==0).sum(axis=1) / (df.shape[1])<0.2]

在头文件问题上,如果没有看到文件或数据帧的样子,就有点难以回答

相关问题 更多 >