Python 如何加快数据帧设置?
现在我有一个Python 如何加快数据帧设置?,python,pandas,dataframe,Python,Pandas,Dataframe,现在我有一个列表,记录的格式是(索引、列、值),还有一个数据框,其中填充了0。对于列表中的每个记录,我应该执行类似于df.loc[index,column]+=value的操作。这是一个示例: import pandas as pd df = pd.DataFrame(index=list('abcd'),columns=list('abcd'),dtype=int) df = df.fillna(0) records = [('a','b',3),('a','b',5),('c','a',6)
列表
,记录的格式是(索引、列、值)
,还有一个数据框
,其中填充了0
。对于列表中的每个记录
,我应该执行类似于df.loc[index,column]+=value的操作。这是一个示例:
import pandas as pd
df = pd.DataFrame(index=list('abcd'),columns=list('abcd'),dtype=int)
df = df.fillna(0)
records = [('a','b',3),('a','b',5),('c','a',6)]
for index,column,value in records:
df.loc[index,column] += value
预计产量将为:
a b c d
a 0 8 0 0
b 0 0 0 0
c 6 0 0 0
d 0 0 0 0
但是它运行得太慢了,因为记录
列表太大了,我想知道有什么方法可以加速它
更新:使用int
索引和列名而不是str
并不重要,也就是说,数据结构也可以是numpy.array
而不是数据帧。因此,输入记录
的格式如下:
records = [(0,1,3),(0,1,5),(3,1,6)]
当然,预期的输出可以是numpy。数组如下所示:
[[0. 8. 0. 0.]
[0. 0. 0. 0.]
[6. 0. 0. 0.]
[0. 0. 0. 0.]]
与一起使用,因此不需要空数据框,只需索引和列名:
records = [('a','b',3),('a','b',5),('c','a',6)]
r = list('abcd')
c = list('abcd')
df1 = (pd.DataFrame(records)
.pivot_table(index=0, columns=1, values=2, aggfunc='sum', fill_value=0)
.reindex(index=r, columns=c, fill_value=0))
print (df1)
1 a b c d
0
a 0 8 0 0
b 0 0 0 0
c 6 0 0 0
d 0 0 0 0
事实证明,您确实可以使用NumPy数组而不是数据帧。这个特殊的解决方案利用了
将numpy导入为np
arr=np.zero((4,4),dtype=int)
打印(arr,end='\n\n')
idx_记录=[(0,1,3)、(0,1,5)、(2,0,6)]
dim_1_idx,dim_2_ix,VAL=zip(*idx_记录)
打印(dim_1_idx)
打印(尺寸2_九)
打印(VAL,结束='\n\n')
np.add.at(arr,(尺寸1×idx,尺寸2×ix),VAL)
打印(arr)
输出:
[[0]
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
(0, 0, 2)
(1, 1, 0)
(3, 5, 6)
[[0 8 0 0]
[0 0 0 0]
[6 0 0 0]
[0 0 0 0]]
C.K.的基准测试显示,该解决方案在1000万行上需要约7.20秒,而熊猫方法需要约10.55秒。你能发布预期输出的情况吗?@当然,我已经编辑了这个问题。目前已经提出了一个完美的解决方案。非常感谢您。记录列表中是否会有多个值添加到同一元素/位置?@AMC是的,有。事实上,正是多个值使问题难以解决。@C.K.列名是字符串,还是仅仅是整数/索引?这很有效,这对我很有用!谢谢!对于像我这样的数据,使用numpy.array
更快,而如果必须使用DataFrame
,jezrael的答案是完美的。顺便说一下,非常感谢你。