【问题标题】:too long dataframe apply row functions太长的数据框应用行函数
【发布时间】:2014-05-07 06:21:25
【问题描述】:

读取列中时间值的 csv 文件,并尽可能高效地获取具有 1 列值和日期时间索引的数据框。我做了一个 read_csv,然后是一个堆栈和下面的函数,但它会消耗更多的时间和内存。

有人有更好的方法吗?

df.apply(lambda row: row['DATE'] + relativedelta( hours = int(row['level_2'][2:])), axis=1)

DATE        H01 H02 H03 H04 ...
2014/01/01  1.2 2.4 3.3 4.1
2014/01/02  4.3 2.6 3.2 4.1

得到:

DATE
2014-01-01 00:00:00    1.2
2014-01-01 01:00:00    2.4
2014-01-01 02:00:00    3.3
2014-01-01 03:00:00    4.1

【问题讨论】:

  • 有 24 列吗? (即每小时是否有一列?)
  • 回答了两种情况,我想知道是否有/应该是更好的方法。

标签: python pandas


【解决方案1】:

如果你有一个每小时(即 24)的列并且每个日期都存在,那么你会更好地在 numpy 中进行重塑(它会更快),并通过date_range 生成 DatetimeIndex。

假设日期是索引(它是一个 DatetimeIndex),而其他 24 列是小时:

vals = df.values.reshape(-1)
new_index = pd.date_range(start=df.index[0], periods=24*len(df), freq='H')
pd.Series(vals, new_index)

否则,您可以使用 itertools 产品创建新索引...。我将首先创建列 Hours:

df.columns = np.arange(0, len(df.columns)) * pd.offsets.Hour(1)

In [11]: df
Out[11]: 
            <0 * Hours>  <Hour>  <2 * Hours>  <3 * Hours>
DATE                                                     
2014-01-01          1.2     2.4          3.3          4.1
2014-01-02          4.3     2.6          3.2          4.1

注意:再次强调,此处 DATE 是一个 DatetimeIndex。

from itertools import product
new_index = [t + td for t, td in product(df.index, df.columns)]

In [21]: pd.Series(df.values.reshape(-1), new_index)
Out[21]: 
2014-01-01 00:00:00    1.2
2014-01-01 01:00:00    2.4
2014-01-01 02:00:00    3.3
2014-01-01 03:00:00    4.1
2014-01-02 00:00:00    4.3
2014-01-02 01:00:00    2.6
2014-01-02 02:00:00    3.2
2014-01-02 03:00:00    4.1
dtype: float64

【讨论】:

    【解决方案2】:

    您要查找的命令是stack。文档中的更多信息:http://pandas.pydata.org/pandas-docs/stable/reshaping.html#reshaping-by-stacking-and-unstacking

    基本上,您正在考虑使用堆栈,然后将Hxx 转换为xx:00:00,这应该很简单。

    【讨论】:

    • 我实际上是这样做的,但它消耗的内存更长且更强大(一个文件需要 2 分钟)。有更有效的方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2020-03-04
    • 2019-02-07
    • 1970-01-01
    • 2016-06-07
    • 2014-02-26
    相关资源
    最近更新 更多