【问题标题】:Pandas group by several values in a single columnPandas 按单个列中的多个值分组
【发布时间】:2015-12-31 02:29:50
【问题描述】:

我从 205MB 的 csv(大约 110 万行 x 15 列)创建了一个 pandas 数据框。它包含一个名为starttime 的列,它是dtype object(更准确地说是一个字符串)。格式如下:7/1/2015 00:00:03

我想从这个 pandas 数据框创建两个新的数据框。一个应包含与周末日期对应的所有行,另一个应包含与工作日日期对应的所有行。

周末日期是:

weekends = ['7/4/2015', '7/5/2015', '7/11/2015', '7/12/2015', 
            '7/18/2015', '7/19/2015', '7/25/2015', '7,26/2015']

我试图将字符串转换为日期时间 (pd.to_datetime),希望这会使值更易于解析,但是当我这样做时,它挂了很长时间,以至于我最终重新启动了几次内核。

然后我决定使用df["date"], df["time"] = zip(*df['starttime'].str.split(' ').tolist()) 在原始数据框中创建两个新列(一列用于日期,一列用于时间)。接下来我想我会使用布尔测试将周末记录(根据新的date 字段)“标记”为True 和所有其他False 并创建另一个包含这些值的列,然后我就可以按TrueFalse 分组。

例如, test1 = bikes['date'] == '7/1/2015' 为 2015 年 7 月 1 日的所有值返回 True,但我不知道如何迭代 weekends 中的所有项目,以便我得到所有周末日期的 True。我试过这个并打破了Python(再次挂起):

for i in weekends:
    for k in df['date']:
        test2 = df['date'] == i

如果有任何帮助(包括我的逻辑和代码),我将不胜感激。

【问题讨论】:

  • 您应该能够在读取 csv 时解析该字符串,因此如果您将列名或序数值传递给 read_csv,那么它将以日期时间的形式读取:@987654338 @ 应该可以工作,然后你可以打电话给df['starttime'].dt.dayofweek,所有的周末都将是那些在[5,6]中值的周末
  • @EdChum 感谢您的建议,但我收到了 Can only use .dt accessor with datetimelike values 错误。我认为那是因为starttime 是一个字符串。
  • 您还没有说明您是否已经尝试使用 parse_dates 解析字符串,就像我说的那样,您需要在从 csv 读取时解析,作为后处理步骤某些原因导致您的计算机死机,这是不应该的
  • @EdChum 我完全按照您的指示并收到了该消息。
  • @EdChum 我错过了括号。您的解决方案效果很好。谢谢。

标签: python datetime pandas


【解决方案1】:

首先,创建一个包含 1.1m 行的字符串时间戳的 DataFrame:

df = pd.DataFrame({'date': ['7/1/2015 00:00:03', '7/1/2015 00:00:04'] * 550000})

接下来,您可以简单地将它们转换为 Pandas 时间戳,如下所示:

df['ts'] = pd.to_datetime(df.date)

此操作只用了不到两分钟。但是,如果您指定格式,则耗时不到 7 秒:

df['ts'] = pd.to_datetime(df.date, format='%m/%d/%Y %H:%M:%S')

现在,很容易设置周末标志如下(大约需要 3 秒):

df['weekend'] = [d.weekday() >= 5 for d in df.ts]

最后,很容易对 DataFrame 进行子集化,几乎不需要任何时间:

df_weekdays = df.loc[~df.weekend, :]
df_weekends = df.loc[df.weekend, :]

周末旗帜是为了帮助解释正在发生的事情。可以简化如下:

df_weekdays = df.loc[df.ts.apply(lambda ts: ts.weekday() < 5), :]
df_weekends = df.loc[df.ts.apply(lambda ts: ts.weekday() >= 5), :]

【讨论】:

  • 感谢您的帮助。你说的超级快是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多