我有一个操作,它输出一系列元组,例如
[('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和列名。但是,我将在多行中执行此操作,并且我认为这种方法将不必要地占用大量内存。
有更好的方法吗?
答案 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)