pandas使用笔记-df.map\apply\iterrows
2020-11-05 本文已影响0人
非鱼2018
最近因工作需要,写了一个小工具,主要就是用来分析整合数据,首选当然用pandas,主要是对字符串的处理,做出来了,总感觉还是不够完美,又翻了下pandas资料,记下笔记
工具开始要做的是,数据整理,某列列可能包含多个数据,逗号分隔,首选要split,再检查分割后的单个数据之前是否出现,打印重复索引(判断某数据完全重复可直接使用df.duplicated('列名')方法,),后面再去做相应查询,并整理查询数据
以下代码主要是做数据的转换,以及查找重复数据:
# coding=utf-8
import pandas as pd
import os
datafile = {'filename': ['filename_01', 'filename_02', "filename3"],
'path': ["/path1,/path3","\path2", "path3,path2"]}
df = pd.DataFrame(datafile, index=range(1,len(datafile)+2)) #索引从1开始
#1.首先对path列进行重整,将路径分隔符统一转为os.sep
# 使用apply对某列数据进行清洗
df['path']=df['path'].apply(lambda x:str(x).replace('/',os.sep))
def f(x):
return tuple(x.split(','))
#2.path列都应用逗号分隔,并计算实际path个数
# map的使用 第一种用法
path_lists = tuple(i for arr in tuple(df['path'].map(f).to_list()) for i in arr)
print("去重后路径个数:",len(set(path_lists )))
df['path2'] = df['path'].map(f)
"""
1 [path1, path3]
2 [path2]
3 [path3, path2]
Name: path2, dtype: object
"""
# 3.查找重复,并打印上一次出现的行,列索引,iterrows进行df迭代
path_index = {}
path_info={}
#path_dupliate=[]
for row_index, row in df.iterrows():
deplute=''
for index, data in enumerate(row['path2'], start=1):
#print("第几行:{},第几个:{}:>>>{}".format(row_index, index, data))
if column in path_index:
str1=column + "数据重复:第一次出现位置"+str(path_index[data])+';'
deplute +=str1
else:
deplute="不含重复"
path_index[data] = (row_index, index)
path_info[(row['filename'])] = deplute 构造字典,后面直接使用map生成新的列,
#path_dupliate.append(deplute)
df['是否重复']=df['filename'].map(path_info) #df.map的第二种用法,参数为字典,产生新的列
df['是否重复']=df['是否重复'].fillna(value='不包含重复数据')
#df['chongfu2']=path_dupliate
print(df)
df.to_excel("info.xlsx")
执行结果:
image.png
2.或先找出重复的数据,然后再迭代df查看某数据是否是重复数据
count_only=set(path_lists )
dict1={}
for i in count_only:
#print("{}:{}".format(i,path_lists .count(i)))
dict1[i]=list3.count(i)
for index,values in df['path2'].to_dict().items():
#print("{}={}".format(index,values))
for value in values:
if value in dict1 and dict1[value]>1:
print(str(index)+"->重复数据:",value)
迭代df的列
for label, ser in df.items():
print(label)
for d in ser:
print(d)