高效的Pandas Dataframe插入

时间:2016-02-16 15:07:26

标签: python performance pandas

我试图添加像[[(1,0.44),(2,0.5),(3,0.1)],[(2,0.63),(1,0.85),(3,0.11)],[...]]这样的浮动值 到Pandas数据框,看起来像是从元组的第一个值构建的矩阵

df = 1 2 3 1 0.44 0.5 0.1 2 0.85 0.63 0.11 3 ... ... ...

我试过了:

    for key, value in enumerate(outer_list):
      for tuplevalue in value:
        df.ix[key][tuplevalue[0]] = tuplevalue[1]

问题是我的NxN-Matrix包含大约10000x10000个元素,因此我的方法需要很长时间。还有其他可能加快这个速度吗?

(不幸的是,列表中的值不是由第一个元组元素排序的)

2 个答案:

答案 0 :(得分:2)

使用列表推导来首先对数据进行排序和提取。然后从已排序和清理的数据中创建数据框。

data = [[(1, 0.44), (2, 0.50), (3, 0.10)],
        [(2, 0.63), (1, 0.85), (3, 0.11)]]

# First, sort each row.
_ = [row.sort() for row in data]

# Then extract the second element of each tuple.
new_data = [[t[1] for t in row] for row in data]

# Now create a dataframe from your data.
>>> pd.DataFrame(new_data)
      0     1     2
0  0.44  0.50  0.10
1  0.85  0.63  0.11

答案 1 :(得分:1)

这可以使用字典(如果您需要保留列顺序,或者列名是字符串)。也许亚历山大会更新他的答案来解释这一点,我几乎可以肯定他会有比我提议的更好的解决方案:)

以下是一个例子:

from collections import defaultdict

a = [[(1,0.44),(2,0.5),(3,0.1)],[(2,0.63),(1,0.85),(3,0.11)]]
b = [[('A',0.44),('B',0.5),('C',0.1)],[('B',0.63),('A',0.85),('C',0.11)]]

首先是:

row_to_dic = [{str(y[0]): y[1] for y in x} for x in a]

dd = defaultdict(list)
for d in (row_to_dic):
    for key, value in d.iteritems():
        dd[key].append(value)

pd.DataFrame.from_dict(dd)

    1   2   3
0   0.44    0.50    0.10
1   0.85    0.63    0.11

和b:

row_to_dic = [{str(y[0]): y[1] for y in x} for x in b]

dd = defaultdict(list)
for d in (row_to_dic):
    for key, value in d.iteritems():
        dd[key].append(value)

pd.DataFrame.from_dict(dd)
      A     B   C
0   0.44    0.50    0.10
1   0.85    0.63    0.11