使用df.loc

时间:2018-07-04 01:12:30

标签: python pandas optimization

我正在对一些最慢的代码进行时间测试,并隔离出了耗时最长的代码段。

此代码段从列表中获取数据并将其存储到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 个答案:

答案 0 :(得分:1)

代替循环,我建议直接从列表中构造一个DataFrame。然后根据需要手动调整列名称和索引。像这样:

df = pd.DataFrame.from_records(all_issues)
df.columns = ['T' + str(c+1) + ' - To' for c in df.columns]

答案 1 :(得分:1)

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

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