python之路

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)

上一篇下一篇

猜你喜欢

热点阅读