【问题标题】:Create two columns based on single column but not when empty基于单列创建两列但为空时不创建
【发布时间】: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”)的实际dtypeobject(字符串),而不是浮点数,所以我不确定它为什么会给出这个错误。

如何修改它以使其正常工作但跳过该列没有值的行?

【问题讨论】:

  • 您能否提供minimal reproducible example 提供重现问题的示例数据?现在的问题是您试图在 float 对象(可能只是您的列中的一个数字)上使用 .str 方法,这样就不会发生
  • 也仅供参考,object 不代表字符串。它是能够容纳string 的dtype,但它也可以轻松容纳各种不同的对象,包括floatdf = pd.DataFrame([True, 'True', 1, 1.00]) 将有 dtype objecttype(df[0][0])bool
  • 我添加了一个示例数据框

标签: python python-3.x pandas anaconda


【解决方案1】:

不需要自定义功能

#df=pd.DataFrame({'string':["2018-11-29 TO 2018-11-30","2018-11-29 TO 2018-11-30","2018-11-29 TO 2018-11-30"]})
df.string.str.split(' TO ',expand=True).apply(pd.to_datetime)
Out[571]: 
           0          1
0 2018-11-29 2018-11-30
1 2018-11-29 2018-11-30
2 2018-11-29 2018-11-30
#pd.concat([df,df.string.str.split(' TO ',expand=True).apply(pd.to_datetime)],axis=1)

更新

df1=df.col1.str.split('TO',expand=True).apply(pd.to_datetime,errors='coerce')
df1.columns=['col1_1', 'col1_2']
df2=df.col2.str.split('TO',expand=True).apply(pd.to_datetime,errors='coerce')
df2.columns=['col2_1', 'col2_2']
pd.concat([df,df1,df2],1)
Out[578]: 
      id                    col1    ...              0          1
0    Bob  2018-11-29TO2018-11-30    ...     2018-12-01 2018-12-31
1  James  2018-10-19TO2018-10-31    ...            NaT        NaT
2   Jane  2018-04-05TO2018-07-12    ...     2018-11-29 2018-11-30
[3 rows x 7 columns]

【讨论】:

  • 谢谢!但是如果某些值是空白/空的,我该怎么办?
  • @ArthurDent pandas.pydata.org/pandas-docs/stable/generated/… 试试errors='coerce'
  • 抱歉,申请时遇到问题,因为它不能应用于每一列,只能应用于两列。
  • @ArthurDent 你有两列,所以你需要在 str.split 上面做两次。那么应该没问题
  • 我添加了示例数据框。
猜你喜欢
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
相关资源
最近更新 更多