【问题标题】:Pandas drop_duplicates() function does not work on my csv filePandas drop_duplicates() 函数不适用于我的 csv 文件
【发布时间】:2022-02-19 06:08:43
【问题描述】:

我正在为 Python 和数据分析基础课程做练习,但我在使用 pandas 的 drop_duplicates 函数时遇到了问题。 在我的工作目录中,我有一个具有这种结构的 csv 文件:

name,type,size(B)
bw,.png,94926
ciao,.txt,12
daffodil,.jpg,24657
eclipse,.png,64243
pippo,.odt,8299
song1,.mp3,1087849
song2,.mp3,764176
trump,.jpeg,10195
bw,.png,94926
daffodil,.jpg,24657
eclipse,.png,64243
trump,.jpeg,10195
bw,.png,94926
daffodil,.jpg,24657
eclipse,.png,64243
trump,.jpeg,10195

这是程序的一部分,我根据文件的扩展名将文件移动到他们的文件夹中,使用文件数据创建/更新摘要文件,最后尝试从 csv 中删除任何重复的行:

def move_files_and_update_recap(files, files_dir_path):
    
    with open('recap.csv', 'a', newline='') as recap:
        writer = csv.writer(recap)
        if("recap.csv" not in work_dir_elements):
            
            writer.writerow(['name', 'type', 'size(B)'])
    
            
        for file in sorted(files):
            # original file path
            file_path = os.path.join(files_dir_path, file)
            # file name
            file_name = os.path.splitext(file)[0]
            # file extension
            file_extension = os.path.splitext(file)[1]
            #file size
            file_size = os.path.getsize(file_path)
            #file type
            file_type = ""
        
            for key, value in file_types.items():
                 if(file.endswith(tuple(value))): # if the file has a recognizable extension findable in "file_types" 
                        file_type = key     
                        #if file already exists in the specific folder, print an error
                        if(file in os.listdir(os.path.join(files_dir_path, file_type))):
                            print("Operation failed: {} already exists in {} folder".format(file, file_type))
                        else:
                            # moving file to a specific directory based on its extension 
                            shutil.move(os.path.join(files_dir_path, file), os.path.join(files_dir_path, file_type, file))
                            # print file info
                            print("{} type:{} size:{}".format(file_name, file_extension, file_size))

                            file_data = [file_name, file_extension, str(file_size)] # data info for csv file
                            writer.writerow(file_data)
                            
    df = pd.read_csv('recap.csv')
    df.drop_duplicates(inplace=True)
    

我也尝试了不同的功能设置:

df.drop_duplicates(subset=None, keep=False, inplace=True)

或:

df.drop_duplicates(subset=None, keep="first", inplace=True)

如果我打印 df 结果是一个索引数据框:

        name   type  size(B)
0         bw   .png    94926
1       ciao   .txt       12
2   daffodil   .jpg    24657
3    eclipse   .png    64243
4      pippo   .odt     8299
5      song1   .mp3  1087849
6      song2   .mp3   764176
7      trump  .jpeg    10195
8         bw   .png    94926
9   daffodil   .jpg    24657
10   eclipse   .png    64243
11     trump  .jpeg    10195
12        bw   .png    94926
13  daffodil   .jpg    24657
14   eclipse   .png    64243
15     trump  .jpeg    10195

如果我打印 drop_duplicates 结果,则返回值为 None。 关于如何修复它的一些建议?

【问题讨论】:

  • "如果我打印 drop_duplicates 结果,返回值为 None。关于如何修复它的一些建议?"您正在使用inplace=True 选项,这意味着该函数不会返回任何值,它会更新您原来的df 变量

标签: python pandas dataframe csv duplicates


【解决方案1】:

我认为你一定做错了什么。我试图重现您所描述的整个场景,但它似乎对我的情况有效。

让我分享一些细节

创建数据框的代码:

import re
import pandas as pd

lines = '''name   type  size(B)
0         bw   .png    94926
1       ciao   .txt       12
2   daffodil   .jpg    24657
3    eclipse   .png    64243
4      pippo   .odt     8299
5      song1   .mp3  1087849
6      song2   .mp3   764176
7      trump  .jpeg    10195
8         bw   .png    94926
9   daffodil   .jpg    24657
10   eclipse   .png    64243
11     trump  .jpeg    10195
12        bw   .png    94926
13  daffodil   .jpg    24657
14   eclipse   .png    64243
15     trump  .jpeg    10195'''.splitlines()

columns = lines[0].split()
lines = [re.sub(r'^\d+\s+', '', line).strip() for line in lines[1:]]
lines = [{columns[0]:line.split()[0], columns[1]:line.split()[1], columns[2]:line.split()[2]} for line in lines]
df = pd.DataFrame(lines)

应用删除重复的功能

场景 1:

情景 2:

【讨论】:

  • 这可能与通过 python csv 模块创建的 csv 文件有关吗?不幸的是,我无法使用 pandas 功能来创建文件。项目规范严格要求在该步骤中使用 csv。
  • 我不这么认为。如果您使用inplace=True,则 df 对象会自动更新。可以在行前后查看df.shape。例如:print(df.shape) df.drop_duplicates(subset=None, keep=False, inplace=True) print(df.shape)
  • 最后我只能用这段代码 sn-p 解决问题: df = pd.read_csv ('recap.csv', index_col = False) df = df.drop_duplicates () df.to_csv ("recap.csv", mode = "w", index = False)
猜你喜欢
  • 2017-04-01
  • 2020-08-18
  • 2017-10-06
  • 2017-08-21
  • 1970-01-01
  • 2018-07-13
  • 2021-08-08
  • 2021-09-16
  • 2013-07-09
相关资源
最近更新 更多