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的答案是完美的。顺便说一下,非常感谢你。