初始化空DataFrame以进行动态分配

时间:2017-05-30 04:57:21

标签: python pandas dataframe

我的目标是初始化一个空数据框并逐行填充它。最初我不知道什么是行标签(index),我也不知道columns是什么。此外,index可以是多级的。

这是我想要完成的一个例子。

首选方法

import pandas as pd
import numpy as np

# Demo data which will be used to populate the dataframe
my_list = [pd.Series(np.random.rand(10), index=np.arange(10)*1e-6) for i in range(5)]

# Demo indices which will be used to index the dataframe
id1 = ['a', 'b', 'c', 'd', 'e']
id2 = [0.1, 0.2, 0.3, 0.4, 0.5]
id3 = [0, 1, 2, 3, 4]

df = pd.DataFrame()
for i1, i2, i3, s in zip(id1, id2, id3, my_list):
    df.loc[(i1, i2, i3), :] = s

而且这是不正确的,并将错误抛给我:

KeyError: "['a' 0.1 0] not in index"

当前方法

目前,我解决这个问题的方法是,我知道列标签对于所有行都是相同的,所以一旦我读完第一个系列,就会知道所有系列的标签。另外,我知道指数是三个级别。所以这就是我的工作:

df = None
idx = pd.MultiIndex(labels=[[], [], []], levels=[[], [], []], names=['id1', 'id2', 'id3'])

for i1, i2, i3, s in zip(id1, id2, id3, my_list):
    if df is None:
        df = pd.DataFrame(index=idx, columns=s.index)
    df.loc[(i1, i2, i3)] = s

问题

最好的方法是什么?是否可以删除循环中的if语句和当前方法中的空索引声明,以便它与首选方法一致?

1 个答案:

答案 0 :(得分:1)

我认为使用my_list loopsDataFramepandas构造函数更好更快,因为mux = pd.MultiIndex.from_arrays([id1, id2, id3], names=['id1', 'id2', 'id3']) df = pd.DataFrame(my_list, index=mux) print (df) 0.000000 0.000001 0.000002 0.000003 0.000004 0.000005 \ id1 id2 id3 a 0.1 0 0.804894 0.121733 0.030610 0.084308 0.751264 0.542138 b 0.2 1 0.868729 0.049293 0.679061 0.375005 0.281873 0.182111 c 0.3 2 0.766086 0.779906 0.928323 0.724433 0.275672 0.279673 d 0.4 3 0.656994 0.304625 0.430252 0.350452 0.558119 0.674358 e 0.5 4 0.045430 0.371147 0.885556 0.318458 0.411363 0.419160 0.000006 0.000007 0.000008 0.000009 id1 id2 id3 a 0.1 0 0.941973 0.318702 0.060750 0.108110 b 0.2 1 0.944578 0.839771 0.331519 0.973904 c 0.3 2 0.373569 0.985934 0.855927 0.878398 d 0.4 3 0.041317 0.900308 0.728050 0.897996 e 0.5 4 0.312687 0.662131 0.034483 0.633083 中的{{1}}速度很慢,最好避免它:< / p>

{{1}}