无法将系列转换为<class'int'` =“”>

时间:2018-08-15 19:41:47

标签: python pandas

我有一组带有“年龄”列的数据。我要删除所有年龄大于90岁且小于1856年的行。

这是df的负责人

enter image description here

这是我尝试的: enter image description here

3 个答案:

答案 0 :(得分:1)

您的错误是第2行。df['intage'] = int(df['age'])无效,您无法将pandas系列传递给int函数。

如果df ['age']是对象dtype,则需要使用astype

df['intage'] = df['age'].astype(int)

或者因为要减去两个日期,所以需要使用带有days属性的dt访问器来获取天数作为整数

df['intage'] = df['age'].dt.days

答案 1 :(得分:0)

由于dtypetimedelta64[ns],因此您可以在之间指定两个timedeltas作为端点,也可以先使用numpy将日期转换为数字类型

设置

import pandas as pd
import numpy as np

df = pd.DataFrame({'age': [83, 108, 83, 63, 81]})
df['age'] = pd.to_timedelta(df.age, unit='days')

找到82到107天之间的日期:

df[df.age.between(pd.to_timedelta(82, unit='days'), pd.to_timedelta(107, unit='days'))]
#      age
#0 83 days
#2 83 days

使用numpy

df[(df.age/np.timedelta64(1, 'D')).between(82, 107)]
#      age
#0 83 days
#2 83 days

答案 2 :(得分:0)

一种解决方案是从timedelta列中的age变量中提取日期。

在下面的玩具示例中,您可以看到如何实现这一目标:

import pandas as pd
import datetime
from datetime import timedelta as td

# Create example DataFrame
df = pd.DataFrame([td(83),td(108),td(83),td(63),td(81)], columns=["age"])
print df

# Get days from timedeltas
df.age = df.age.apply(lambda x: x.days)
print df

# Filter ages
df = df[df.age.between(91,1956, inclusive=True)]
print df

打印结果如下:

>>> 
       age
0  83 days
1 108 days
2  83 days
3  63 days
4  81 days
   age
0   83
1  108
2   83
3   63
4   81
   age
1  108