代码之家  ›  专栏  ›  技术社区  ›  swifty

使用df.loc有效地将列表存储到熊猫中

  •  1
  • swifty  · 技术社区  · 8 年前

    我正在对一些速度最慢的代码运行时间测试,并隔离了一个占用时间最长的代码片段。

    此片段从列表中获取数据并将其存储到df中。我知道在与熊猫互动时,for循环是非常忌讳的,所以我想知道我是否可以加快这个速度。

    我有一个所有“问题”的列表,除了使用外部for循环和使用内部for循环将每个问题插入df之外,我别无选择:

    for issues in all_issues:
        # Some code to get the current key of the issue to use in df.loc to insert in the right place
        # Some code to get and append each issue's data to a list named (to_status)
        for i in range(len(to_status)):
            df.loc[key, ('T' + str(i + 1) + ' - To')] = to_status[i]
    

    列表是什么并不重要,实际上我使用了一些不同的列表。尽管它们可以是可变长度的,因此 range(len(to_status)) .

    如果列表是 ['Open','Closed','Open'] 关键是 4000 结果将是:

    df
    key    T1 - To    T2 - To    T3 - To 
    4000   'Open'     'Closed'   'Open'
    
    • 有没有更快的方法来完成这个插入?

    谢谢.

    2 回复  |  直到 8 年前
        1
  •  1
  •   Peter Leimbigler    8 年前

    我建议直接从列表列表中构造一个数据帧,而不是循环。然后根据需要手动调整列名和索引。像这样的:

    df = pd.DataFrame.from_records(all_issues)
    df.columns = ['T' + str(c+1) + ' - To' for c in df.columns]
    
        2
  •  1
  •   min2bro    8 年前

    由于没有示例数据,所以我假设您的数据集与此类似,键和值为list。

    d={
        'key1': [10, 100.1, 0.98, 1.2],
        'key2': [72.5],
        'key3': [1, 5.2, 71.2, 9, 10.11, 12.21, 65, 7]
    }
    
    df=pd.DataFrame.from_dict(d,orient='index').transpose()
    

    输出:

        key3    key2    key1
    0   1.00    72.5    10.00
    1   5.20    NaN     100.10
    2   71.20   NaN     0.98
    3   9.00    NaN     1.20
    4   10.11   NaN     NaN