Python 3.x ValueError:无法将浮点NaN转换为整数

Python 3.x ValueError:无法将浮点NaN转换为整数,python-3.x,pandas,Python 3.x,Pandas,我正在编写一个函数,它返回一个以文档年份为键的字典,并作为值指定一个元组,该元组由def do_get_citations_per_year函数返回 此功能处理df: def do_process_citation_data(f_path): global my_ocan my_ocan = pd.read_csv(f_path, names=['oci', 'citing', 'cited', 'creation', 'timespan', 'journal_sc', 'au

我正在编写一个函数,它返回一个以文档年份为键的字典,并作为值指定一个元组,该元组由def do_get_citations_per_year函数返回

此功能处理df:

def do_process_citation_data(f_path):
    global my_ocan

    my_ocan = pd.read_csv(f_path, names=['oci', 'citing', 'cited', 'creation', 'timespan', 'journal_sc', 'author_sc'],
                          parse_dates=['creation', 'timespan'])
    my_ocan = my_ocan.iloc[1:]  # to remove the first row
    my_ocan['creation'] = pd.to_datetime(my_ocan['creation'], format="%Y-%m-%d", yearfirst=True)
    my_ocan['timespan'] = my_ocan['timespan'].map(parse_timespan)
    #print(my_ocan.info())
    print(my_ocan['timespan'])
    return my_ocan
然后我有了这个函数,运行它时不会触发任何错误:

    result = tuple()
    my_ocan['creation'] = pd.DatetimeIndex(my_ocan['creation']).year

    len_citations = len(my_ocan.loc[my_ocan["creation"] == year, "creation"])
    timespan = round(my_ocan.loc[my_ocan["creation"] == year, "timespan"].mean())
    result = (len_citations, timespan)
    print(result)


    return result
当我在另一个函数中运行该函数时:

def do_get_citations_all_years(data):
    mydict = {}
    s = set(my_ocan.creation)
    for year in s:
        mydict[year] = do_get_citations_per_year(data, year)

    return mydict
我得到一个错误:

  File "/Users/lisa/Desktop/yopy/execution_example.py", line 28, in <module>
    print(my_ocan.get_citations_all_years())
  File "/Users/lisa/Desktop/yopy/ocan.py", line 35, in get_citations_all_years
    return do_get_citations_all_years(self.data)
  File "/Users/lisa/Desktop/yopy/lisa.py", line 112, in do_get_citations_all_years
    mydict[year] = do_get_citations_per_year(data, year)
  File "/Users/lisa/Desktop/yopy/lisa.py", line 99, in do_get_citations_per_year
    timespan = round(my_ocan.loc[my_ocan["creation"] == year, "timespan"].mean())
ValueError: cannot convert float NaN to integer
文件“/Users/lisa/Desktop/yopy/execution_example.py”,第28行,在
打印(my_ocan.get_Quictions_all_years())
文件“/Users/lisa/Desktop/yopy/ocan.py”,第35行,所有年份的引文
返回所有年份是否获得引用(self.data)
文件“/Users/lisa/Desktop/yopy/lisa.py”,第112行,在do_get_引文中
mydict[年]=每年是否获得引用(数据,年)
文件“/Users/lisa/Desktop/yopy/lisa.py”,第99行,在do_get_引文中
timespan=round(my_ocan.loc[my_ocan[“creation”]==year,“timespan”].mean())
ValueError:无法将浮点NaN转换为整数
我能做些什么来解决这个问题


提前感谢

此错误意味着
my_ocan.loc[my_ocan[“creation”]==year,“timespan”].mean()
NaN

在计算平均值之前,应使用
0
填充
NaN
值,因为它不会改变平均值。以下是一个例子:

timespan = my_ocan.loc[my_ocan["creation"] == year, "timespan"].fillna(0).mean()

@Ha Bom,用零填充将改变平均值,我想解决方案是用NaN替换掉行:

timespan=my_ocan.loc[my_ocan[“creation”]==year,“timespan”].dropna().mean()
如果您不想删除任何行,那么您将希望使用mean填充na,例如,请参见以下内容


编辑@Ha Bom解决方案很好,重点是将平均值替换为零

*是
nan
不是
None
@Guimoute谢谢。我的错误:)您也可以通过调用
dropna()
完全删除
NaN
值。这看起来更明确。:)嘿谢谢你的回答,我运行了你的解决方案,但是错误仍然=(timespan=round(my_ocan.loc[my_ocan[“creation”]==year,“timespan”]==year,“timespan”].fillna(0.mean())ValueError:无法将float NaN转换为integerI也在上面的问题中公布了它更具可读性=)嗨,路易斯!运行您的解决方案时,我克服了错误,但结果不是预期的结果:例如,通过运行print(my_ocan.get_引文_per_year(2018))我得到(32451.8235294117647),但当在另一个返回字典的函数中调用此函数时,我得到{2016:(0,nan),2017:(0,nan),2018:(0,nan),2013:(0,nan),2015:(0,nan)}这是为什么?嗨,丽莎,你构建dict的函数是什么样子的?def do_get_citations_all_years(数据):mydict={}s=set(my_ocan.creation)for year in s in s:mydict[year]=do_get_citations_per_year(数据,year)返回mydictah,我明白了,我想原因是我使用dropna()删除了行,我不想这样做。我需要这些值0.0,因为它们在以后计算平均值时很重要。有没有其他方法可以填充这些空值?如果缺失的值可以用零替换,那么@Ha Bom解决方案就是正确的方法。但是您必须确保您有每年的数据,否则
my_ocan.loc[my_ocan[“creation”]==year,“timespan”]
可能只是空的