【问题标题】:How to optimize the following code so as to run it faster?如何优化以下代码以使其运行得更快?
【发布时间】:2020-01-13 00:59:13
【问题描述】:

首先,我有一个带有以下列的 pandas 数据框: "YEAR","1DIGIT","2DIGITS","3DIGITS","SIZE","CODE","VALUE" 180 万行。 这是我纠正数据的代码:

for year in list(data.YEAR.unique()):
    data1 = data[data.YEAR == year]
        for dig in list(data1.3DIGITS.unique()):
            data2 = data1[data1.3DIGITS == dig]
            for size in list(data2.SIZE.unique()):
                data3 = data2[data2.SIZE == size]
                data.loc[(data.YEAR == year)&(data.3DIGITS == dig)&(data.CODE == 9122),"VALUE") = data3[data3.CODE.isin(9001,9057)].VALUE.sum()

如您所见,我想将代码 9001 和 9057 的值相加,并将其分配给代码 9122 的值。这可行,但速度很慢,大约需要 1 个半小时。我们可以做些什么来让它更快?

【问题讨论】:

  • 这可能更适合代码审查
  • 你能举个简单的例子吗

标签: python-3.x pandas dataframe optimization python-3.7


【解决方案1】:

尝试使用pandas的@​​987654321@函数。

这看起来像:

def add_col(df):
    df.loc[(df.CODE == 9122),"VALUE") = df[df.CODE.isin(9001,9057)].VALUE.sum()
    return df

data.groupby(['YEAR', '3DIGITS', 'SIZE']).apply(add_col)

【讨论】:

  • 我不能使用 groupby,因为使用它会使数据无法使用。
  • 您能否更好地解释一下为什么您不能使用我的解决方案?
  • 当我按 YEAR、3DIGITS 和 SIZE 分组时,VALUE 是相加的,因为有很多 VALUE 属于 YEAR、3DIGITS 和 SIZE 三元组。
猜你喜欢
  • 2022-09-30
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 2021-08-05
  • 1970-01-01
相关资源
最近更新 更多