【发布时间】:2018-11-30 16:15:38
【问题描述】:
示例数据框:
id col1 col2
0 Bob 2018-11-29 TO 2018-11-30 2018-12-01 TO 2018-12-31
1 James 2018-10-19 TO 2018-10-31 NaT
2 Jane 2018-04-05 TO 2018-07-12 2018-11-29 TO 2018-11-30
我有两列将日期范围显示为:
"2018-11-29 TO 2018-11-30"
我已成功地将第一列中的每个日期提取到两个新列中,如下所示:
def my_func(data):
dates = data.split(" TO ")
dt1 = pd.to_datetime(dates[0].strip(), format="%Y-%m-%d")
dt2 = pd.to_datetime(dates[1].strip(), format="%Y-%m-%d")
return (dt1, dt2)
df[["new_col_1", "new_col_2"]] = df.apply(lambda row: pd.Series(my_func(row["col1"])), axis=1)
这在“col1”中运行良好,因为每一行都有一个值。然而,在“col2”中,并不是每一行都有一个值。我希望它跳过那些行,但它不起作用。我尝试在 lambda 语句中使用 pd.notnull() 和条件逻辑,但我认为 pd.Series() 正在抛弃它,它一直在尝试传递值,我不断得到:
AttributeError: ("'float' object has no attribute 'split'", 'occurred at index 0')
但是列(“col1”和“col2”)的实际dtype 是object(字符串),而不是浮点数,所以我不确定它为什么会给出这个错误。
如何修改它以使其正常工作但跳过该列没有值的行?
【问题讨论】:
-
您能否提供minimal reproducible example 提供重现问题的示例数据?现在的问题是您试图在
float对象(可能只是您的列中的一个数字)上使用.str方法,这样就不会发生 -
也仅供参考,
object不代表字符串。它是能够容纳string的dtype,但它也可以轻松容纳各种不同的对象,包括float。df = pd.DataFrame([True, 'True', 1, 1.00])将有 dtypeobject但type(df[0][0])是bool -
我添加了一个示例数据框
标签: python python-3.x pandas anaconda