【问题标题】:how to concat between number and values from column based on conditions如何根据条件在列中的数字和值之间进行连接
【发布时间】:2020-12-24 17:23:30
【问题描述】:

谁能帮帮我,我一直在尝试根据条件连接数字和值,但仍然出错。

这是我可以从谷歌表格创建的文档示例。 https://docs.google.com/spreadsheets/d/1lESXb_DBcoH9y0UVNokB9HCKjsgBdQHlyHX5je78yR0/edit#gid=0

这是我之前的代码

    conditions = [
    (df['hour_generated'] == '8'),
    (df['hour_generated'] == '12'),
    (df['hour_generated'] == '17')
            ]

values = [[df_presto.segment_name + df_presto.date_generated-1 + 17].astype(str).str[-2:]
          , [df_presto.segment_name + df_presto.date_generated-1 + '18'].astype(str).str[-2:]
          , [df_presto.segment_name + df_presto.date_generated-1 + '12'].astype(str).str[-2:]
         ]

谢谢,真的很感激

【问题讨论】:

  • 你能澄清一下你想在这里做什么吗?您正在引用 dfdf_presto。您附加的电子表格没有 hour_generated 列。请澄清一下,有人可以帮助您。
  • 您好,感谢您的评论,请忽略df_presto,请假设所有使用df,
  • 我想要做的是获得像我在谷歌表中得到的确切值
  • 目前还不是很清楚你在这里试图用条件和值做什么。无论哪种方式,可能有以下帮助之一:str(datetime.strptime(df.date[1],'%d-%b-%y')- timedelta(days=1)) 将使您的日期列返回一天并创建一个字符串(不要忘记 import datetime)您还有顺便说一句,第一行中的 17 与其他行不同。
  • 基本上我想做的是,如果生成的小时 = 8 然后 concat (segment_name + date_generate-1 + 17) 注释 date_generate -1 是 date_generate 17 的上一个日期,基本上是数字

标签: python pandas


【解决方案1】:

下面的这段代码试图重新创建你在 excel 中所做的一切。

  1. 将日期时间转换为excel存储日期格式的序数/整数(更多here )
  2. 使用np.select 使用我们定义的条件和值创建新列。

代码

import datetime as dt

df['date'] = pd.to_datetime(df['date'])
df['ordinal_date'] = df['date'].map(dt.datetime.toordinal)-dt.datetime(1900, 1, 1).toordinal()+2

conditions = [ (df['hour'] == 8), 
               (df['hour'] == 12),
               (df['hour'] == 17) 
             ]

values = [df.segment + df.ordinal_date.astype(str)+"17",
          df.segment + df.ordinal_date.astype(str)+"8",
          df.segment + df.ordinal_date.astype(str)+"12"
         ]

df['new_col'] = np.select(conditions, values)
df

输出:

  segment       date  hour  ordinal_date   new_col
0       A 2020-12-23     8         44188  A4418817
1       B 2020-12-23    12         44188   B441888
2       C 2020-12-23    17         44188  C4418812
3       D 2020-12-23    17         44188  D4418812

【讨论】:

  • 嗨@venky__ 谢谢,这正是我想要的,非常感谢,还有 1 个问题,对于 A 段 | 2020-12-23 | 8 我想要实现的是当我们找到 8 时,我们将转换为昨天,在上面的示例中是 2020-12-23 转换为 2020-12-22 所以对于第 0 行,结果应该是 A4418717 而不是 A4418817
猜你喜欢
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多