Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pandas从csv中删除重复项时出错_Python_Pandas_Csv - Fatal编程技术网

Python 使用pandas从csv中删除重复项时出错

Python 使用pandas从csv中删除重复项时出错,python,pandas,csv,Python,Pandas,Csv,我的csv文件在此链接上: 我想通过对照每个艺术家ID检查类型的长度来删除csv中的副本。如果一个艺术家在csv中有2个记录(例如ed sheeran的ID6eUKZXaKkcviH0Ku9w2n3V有2个记录,一个记录有1个类型,而第5行有5个类型,那么我想保留类型长度最大的行) 我现在正在使用以下脚本: import pandas import ast df = pandas.read_csv('39K.csv', encoding='latin-1') df['lst_len']

我的csv文件在此链接上:

我想通过对照每个艺术家ID检查类型的长度来删除csv中的副本。如果一个艺术家在csv中有2个记录(例如ed sheeran的ID6eUKZXaKkcviH0Ku9w2n3V有2个记录,一个记录有1个类型,而第5行有5个类型,那么我想保留类型长度最大的行)

我现在正在使用以下脚本:

import pandas
import ast


df = pandas.read_csv('39K.csv', encoding='latin-1')

df['lst_len'] = df['genres'].map(lambda x: len(ast.literal_eval(str(x))))
print(df['lst_len'][0])

df = df.sort_values('lst_len', ascending=False)

# Drop duplicates, preserving first (longest) list by ID
df = df.drop_duplicates(subset='ID')


# Remove extra column that we introduced, write to file
df = df.drop('lst_len', axis=1)
df.to_csv('clean_39K.csv', index=False)
但这个脚本适用于500张唱片(可能是我有错觉认为唱片的大小很重要)

但是,当我为最大的文件39K.csv运行此脚本时,我遇到了以下错误:

Traceback (most recent call last):
******* error in line 5, in <module>....
    df['lst_len'] = df['genres'].map(lambda x: len(list(x)))
    df['lst_len'] = df['genres'].map(lambda x: len(list(x)))
TypeError: 'float' object is not iterable
回溯(最近一次呼叫最后一次):
*******第5行中的错误,在。。。。
df['lst_len']=df['genres'].map(lambda x:len(list(x)))
df['lst_len']=df['genres'].map(lambda x:len(list(x)))
TypeError:“float”对象不可编辑
请告诉我哪里做错了? 谢谢

您输入的csv文件(至少)第16553行有错误数据:

52lUXCmpmAIVsgNd1uADOy,Moosh & Twist,NULL
pandas
在读取文件时将
NULL
解释为
nan
,该文件类型为
float
,不可编辑。其中还有一些其他的
NULL
条目,因此您可以手动删除或修复它们(首选),或者在代码中处理这种情况

例如,如果您真的想假装
NULL
应该被解释为空列表,您可以像这样预处理数据(在读取csv之后):

或者更优雅地使用
na_filter=False
切换到读取csv:

df = pandas.read_csv('39K.csv', encoding='latin-1', na_filter=False)
这将首先防止熊猫用
nan
替换这些值

最后,代码并不像我们想象的那样,因为它正在计算列表的字符串表示中的字符数。解决方案是将空值预处理为表示空列表的字符串,然后使用
ast.literal\u eval
将所有字符串转换回列表:

import pandas
import ast

    df = pandas.read_csv('39K.csv', encoding='latin-1', na_filter=False)
    df.replace(to_replace="NULL", value="[]", inplace=True)

    for item in df['genres']:

        print(str(item))
        print(ast.literal_eval(item))

    df['lst_len'] = df['genres'].map(lambda x: len(ast.literal_eval(x)))

或者可能值得对
DataFrame.fillna(“0”)
进行预处理,或者在整个数据帧中使用empty。@pygo我认为这样做,但我不确定这是否有效,因为
fillna
不接受列表作为其参数,而且我们明确需要一个空列表,因为我们稍后将计算其长度。使用<代码> fILNA(“0”)绝对不工作(测试)而不需要进一步的处理。HMM,<代码> > df= df.fiRNA(′)< /> >将填充NA(例如楠的)和“ie空”,或者替换为“代码> df.Read ysCSV(路径,NaAfStudio=false)< /C> >,默认将空字段视为空字符串。@ PyGo使用<代码> fILNA(′)仍然不起作用,这些值仍然是
nan
。但是你关于
na_filter=False
的想法非常有效,谢谢,我已经把它编辑成了答案。@RobBricheno,太棒了!
import pandas
import ast

    df = pandas.read_csv('39K.csv', encoding='latin-1', na_filter=False)
    df.replace(to_replace="NULL", value="[]", inplace=True)

    for item in df['genres']:

        print(str(item))
        print(ast.literal_eval(item))

    df['lst_len'] = df['genres'].map(lambda x: len(ast.literal_eval(x)))