【问题标题】:Initializing an empty DataFrame for dynamic allocation为动态分配初始化一个空的DataFrame
【发布时间】:2017-05-30 04:57:20
【问题描述】:

我的目标是初始化一个空数据框并逐行填充它。最初我不知道行标签是什么(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 语句和当前方法中的空索引声明,使其符合首选方法的路线?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我认为更好更快的是将DataFrame 构造函数与my_listMultiIndex.from_arrays 一起使用,因为pandas 中的loops 很慢,最好避免它:

    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  
    

    【讨论】:

    • 感谢您的回答。作为跟进,我想我应该在我的问题中指出,对于我的实际数据,我必须有一个循环来遍历该系列,因为我是从一个文件中读取它们(每个系列都是从 HDF 表的条目中读取的) )。我只是将 my_list 用作演示...
    • 那么最好将循环中的数据附加到列表中,最后由concat 创建DataFrame - 也许帮助this 回答。
    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    相关资源
    最近更新 更多