创建每行具有元组但缺少列的熊猫数据框

时间:2019-08-26 16:25:24

标签: python pandas

我有一个操作,它输出一系列元组,例如 [('a',1.0), ('c', 2.5)]。这样做需要大量输入,因此输出看起来像

[('a',1.0), ('c', 2.5)]
[('b',1.5), ('c', 2.5)]
[('a', 5.0), ('b',1.5), ('c', 2.75)]

应该输出看起来像这样的数据框

>>> df
     a     b     c
0    1.0   NaN   2.5
1    NaN   1.5   2.5
2    5.0   1.5   2.75

但是,列名是事先未知的,因此在某些时候数据生成,我可能会以('z',12.0)结尾。

我认为最简单的方法是为每一行创建一个数据框并连接这些数据框:

df_list = []
for row in rows:
     tuple_result = f(row)
     df_list.append(pd.DataFrame(...)) # generate a single-row dataframe
df = pd.concat(df_list, axis=0, ignore_index=True)

,它将处理所有的NaN和列名。但是,我将在多行中执行此操作,并且我认为这种方法将不必要地占用大量内存。

有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

您可以使用列表推导,将每行的元组转换为字典。

my_data = [
    [('a',1.0), ('c', 2.5)],
    [('b',1.5), ('c', 2.5)],
    [('a', 5.0), ('b',1.5), ('c', 2.75)]
]

>>> pd.DataFrame([dict(row) for row in my_data])
     a    b     c
0  1.0  NaN  2.50
1  NaN  1.5  2.50
2  5.0  1.5  2.75

时间

%timeit pd.DataFrame([dict(row) for row in my_data * 100000])
# 559 ms ± 92 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit pd.DataFrame(map(dict, my_data * 100000))
# 438 ms ± 25.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
df_list = []
for row in my_data * 100000:
     df_list.append(pd.DataFrame(dict(row), index=[0])) 
df = pd.concat(df_list, axis=0, ignore_index=True, sort=False)
# 6min 11s ± 1min 54s per loop (mean ± std. dev. of 7 runs, 1 loop each)