我的目标是初始化一个空数据框并逐行填充它。最初我不知道什么是行标签(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
语句和当前方法中的空索引声明,以便它与首选方法一致?
答案 0 :(得分:1)
我认为使用my_list
loops
和DataFrame
的pandas
构造函数更好更快,因为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}}