【发布时间】:2017-01-14 21:40:26
【问题描述】:
我正在 Coursera 上上一门课程,我有一个数据集可以执行一些操作。我已经得到了问题的答案,但我的答案需要时间来计算。
Here 是原始数据集,下面提供了示例屏幕截图。
任务是将数据从月度值转换为季度值,即我需要将 2000-01、2000-02、2000-03 数据汇总到 2000-Q1 等等。 2000-Q1 的新值应该是这三个值的平均值。 同样,2000-04、2000-05、2000-06 将变为 2000-Q2,新值应为 2000-04、2000-05、2000-06 的平均值
这是我解决问题的方法。
首先我定义了一个函数quarter_rows(),它接受一行数据(作为一个系列),使用列索引遍历每三个元素,用上面解释的计算的平均值替换一些值(就地)并返回行
import pandas as pd
import numpy as np
housing = pd.read_csv('City_Zhvi_AllHomes.csv')
def quarter_rows(row):
for i in range(0, len(row), 3):
row.replace(row[i], np.mean(row[i:i+3]), inplace=True)
return row
现在我对数据进行了一些子集化和清理,只留下我需要处理的内容
p = ~housing.columns.str.contains('199') # negation of columns starting with 199
housing = housing[housing.columns[p]]
housing3 = housing.set_index(["State","RegionName"]).ix[:, '2000-01' : ]
然后我使用 apply 将函数应用于所有行。
housing3 = housing3.apply(quarter_rows, axis=1)
我得到了预期的结果。示例如下所示
但整个过程需要一分钟多的时间才能完成。原始数据框大约有 10370 列。
我不知道是否有办法在 for 循环和应用函数中加快速度。我的 quarter_rows() 函数中的 for 循环占用了大部分时间。
我已经尝试过 python lambdas,但我尝试的每一种方式都抛出了异常。
我真的很想找到一种方法来使用三个连续值而不使用 for 循环来获取平均值。
谢谢
【问题讨论】:
-
感谢编辑