在处理数据的时候,会出先相同的列或者行,我们需要有时候需要对其中一列或者其中一行进行操作
因为数据清洗的过程会碰到多种情况
既有合并的又有空列
使用pandas进行读取后
现在需要以第一行作为列名,然后去掉NaN的列
读取数据的时候,在pd.read_excel()中可以添加参数header=None这个参数 默认没有头列
代码如下
import pandas as pd data = pd.read_excel('test.xlsx',header=None)
接下来处理为NaN的列
因为pandas读取NaN只能判断出状态,并不能作为选择,这里需要转变一个想法,我常用的是转换为True or False,刚好pandas里面有自带的函数,代码如下:
使用notna()函数
# 因为都进来的数据,我们需要的列名还是在第一行,固我们取第一行的所有 judge_nan_col = data.iloc[1,:].notna().tolist() print(judge_nan_col)
tolist()是方便我们取index
接下来是关键的部分了,因为有多个False,所以如果按照我们之前的list.index()这种是不可取的
这里我以为大家演示下
返回的同一个索引,默认是第一次出现的,所以这个方法是不可取的
需要使用count()函数进行计数
count = judge_nan_col.count(False) index_list = [] index = -1 # 通过list.index()方法的__start参数,指定起始索引 for i in range(null, count): index = judge_nan_col.index(False, index + 1) index_list.append(index) print(index_list)
list_len = len(judge_nan_col) index_list = [] for i in range(null, list_len): if judge_nan_col[i] == False: index_list.append(i) print(index_list)
index_list = [i for i, col in enumerate(judge_nan_col) if col == False] print(index_list)
目前我能想到的就这三种了
获取到我们想要的列了,并且存到了列表中,这下就是进行删除了
pandas自带函数drop()就可以尽心行或列的删除
# 可以根据需要看删除哪一列,我这里是全部进行删除 data = data.drop(index_list,axis=1) print(data)
现在离目标很近了,就差第一行了,还是一样,使用data.iloc()函数,重新构建dataframe
# 获取列名 columns = data.iloc[1,:].tolist() print('columns: ',columns,'\n') print('=================================') data = data.iloc[1:,:] data.columns=columns print(data)
输出到excel
data.to_excel('complete.xlsx',index=False)
处理行,同上 不过删除的时候
需要将data = data.drop(axis=0)
axis=1 转换为 axis=0
以上为个人经验,希望对您有所帮助。