首先需要用的python包:
import pandas as pd
然后,正式开始处理数据。
1.定义一个数组
dataset=[[1,2,3,4,5],[1,2,3,None,5],[1,None,3,4,5],[1,2,3,4,5]]
2.将list类型转为pandas的DataFrame类型
df=pd.DataFrame(dataset)
print(df)
3.找到具有缺失值的数据
dataset_missing=df[df.isnull().values==True]
print(dataset_missing)
今天做实验发现,这个方法有问题,当一行具有多个缺失值时,会返回多个行的数据,因此决定用一个笨办法:
def find_complete_rows(df):
"""
找到DataFrame的完整数据行
:param df:
:return:
"""
missing_matrix = df.isnull()
print(missing_matrix)
complete_rows = []
for i in range(missing_matrix.shape[0]):
flag = True
for j in range(missing_matrix.shape[1]):
if missing_matrix.iloc[i, j]:
flag = False
break
if flag:
complete_rows.append(i)
return complete_rows
有点笨但是简单啊,不想思考了-0-
4.如果需要找到具有缺失值的列,需要做两步操作
#1判断哪些列存在缺失值(返回的是Series类型的数据)
coloums_missing_status=df.isnull().any()
#2找到缺失列的列,用to_list()方法返回list
coloums_missing=coloums_missing_status.index[coloums_missing_status==True].to_list()
5.找到没有缺失值的数据,也需要两步
#1根据前面找到的缺失数据,获得缺失值的列名(返回的list)
missing_index=dataset_missing.index.to_list()
print(missing_index)
#2在原始数据中去除有缺失值的行
dataset_complete=df.loc[~df.index.isin(missing_index)]
print(dataset_complete)
最后附上所有代码
import pandas as pd
"""
input: Full dataset
output: Missing dataset and Complete dataset
"""
def split_dataset(dataset):
#将list类型转为pandas的DataFrame类型
df=pd.DataFrame(dataset)
print(df)
#找到具有缺失值的数据
dataset_missing=df[df.isnull().values==True]
print(dataset_missing)
#如果需要找到具有缺失值的列,需要做两步操作
#1判断哪些列存在缺失值(返回的是Series类型的数据)
colums_missing_status=df.isnull().any()
print(colums_missing_status)
#2找到缺失列的列,用to_list()方法返回list
colums_missing=colums_missing_status.index[colums_missing_status==True].to_list()
print(colums_missing)
coloums_missing=coloums_missing_status.index[coloums_missing_status==True].to_list()
print(coloums_missing)
#找到没有缺失值的数据,也需要两步
#1根据前面找到的缺失数据,获得缺失值的列名(返回的list)
missing_index=dataset_missing.index.to_list()
print(missing_index)
#2在原始数据中去除有缺失值的行
dataset_complete=df.loc[~df.index.isin(missing_index)]
print(dataset_complete)
return dataset_missing,dataset_complete
if __name__=='__main__':
#定义一个数组
dataset=[[1,2,3,4,5],[1,2,3,None,5],[1,None,3,4,5],[1,2,3,4,5]]
dataset_missing,dataset_complete=split_dataset(dataset)
=======================================
今天突然发现,如果在一行数据中存在多个缺失值,就不能用上面的步骤获得缺失数据了,因为会重复。那么,如果一行数据中存在多个缺失值,获得缺失数据的方法如下:
Pandas居然有自带的去Nan方法
//使用pandas自带的dropna()方法:
#删除表中某行全部为NaN的行
nonan_df = df.dropna(axis=0, how='all')
#删除表中某行含有任何NaN的行
nonan_df = df.dropna(axis=0, how='any')
#删除表中有NaN的任意行
nonan_df = df.dropna(axis=0)
“”“
补充:
删除行的参数axis = 0
删除列的参数axis = 1
”“”
当一行数据有多个缺失值时,查看有nan的行
#1 查看含有nan的行
dataset_missing=df[df.isna().any(axis=1)]
#2 查看不含nan的行
dataset_complete=df[~df.isna().any(axis=1)]
新的代码如下
def split_dataset(dataset):
#将list类型转为pandas的DataFrame类型
df=pd.DataFrame(dataset)
print('------初始数据-------')
print(df)
#找到具有缺失值的数据,需要两步
#1 查看含有nan的行
dataset_missing=df[df.isna().any(axis=1)]
#2 查看不含nan的行
dataset_complete=df[~df.isna().any(axis=1)]
#判断各列的缺失情况
colums_missing_status=dataset_missing.isna().any()#判断的数据小一些
colums_missing=colums_missing_status[colums_missing_status==True].index.to_list()
print('------有nan的缺失数据-----------')
print(dataset_missing)
print('------无nan的完整数据-----------')
print(dataset_complete)
print('------有nan的列-----------')
print(colums_missing)
if __name__=='__main__':
#定义一个数组
dataset=[[1,2,3,4,5],[1,None,None,None,5],[1,None,3,4,5],[1,2,3,4,5]]
split_dataset(dataset)
运行结果