我想将一组列s_cols
与另外两列b
,c
相乘。
到目前为止,我正在做
s_cols = ['t070101', 't070102', 't070103', 't070104', 't070105', 't070199', 't070201', 't070299']
dfNew = df[s_cols]*df[`c`]*df[`b`]
但该操作从我的系统中吸取了所有16GB的内存并使我的OSX崩溃 - 该表有148000
行。
我该怎么做?我想逐行应用需要较少的活动内存,但它看起来效率低于向量化操作。
表格:
b TELFS t070101 t070102 t070103 t070104 \
TUCASEID
20030100013280 8155462.672158 2 0 0 0 0
20030100013344 1735322.527819 1 0 0 0 0
20030100013352 3830527.482672 2 60 0 0 0
20030100013848 6622022.995205 4 0 0 0 0
20030100014165 3068387.344956 1 0 0 0 0
t070105 t070199 t070201 t070299 \
TUCASEID
20030100013280 0 0 0 0
20030100013344 0 0 0 0
20030100013352 0 0 0 0
20030100013848 0 0 0 0
20030100014165 0 0 0
c
TUCASEID
20030100013280 31
20030100013344 31
20030100013352 31
20030100013848 31
20030100014165 31
更新
问题似乎是使用df[s_cols]
。单个列的乘法立即发生,但已经乘以df[['t070101', 't070102']]
需要足够长的时间,以至于我害怕我的系统再次崩溃并抢先关闭Python进程。
答案 0 :(得分:1)
我的猜测是你真的想做类似以下的事情:
In [11]: cols = ['a', 'b']
In [12]: df1
Out[12]:
a b c d
0 1 4 1 4
1 2 5 2 10
2 3 6 3 18
In [13]: df1[cols].multiply(df1['c'] * df1['d'], axis=0)
Out[13]:
a b
0 4 16
1 40 100
2 162 324
正如您可以通过此示例看到的代码:索引被添加到列之前(因此DataFrame的大小在长度上为N ^ 2,可能会导致内存错误/减速):
In [21]: df1[cols] * df1['c'] * df1['d']
Out[21]:
0 1 2 a b
0 NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN
除此之外:您应该在此处放置括号以确保首先计算RHS。
这类问题的另一个选择是使用numexpr,请参阅pandas docs的enhancing performance with eval部分。但是我不认为(目前)支持多项任务,所以在这种情况下它无济于事 - 但是值得一读。
答案 1 :(得分:0)
问题显然是pandas
'对数据帧切片df[s_cols]
进行次优处理。
如果我做了
for col in s_cols:
df[col] = df[col].multiply(df.monthDays * df.TUFNWGTP)
操作几乎立即完成。