pandas将数据框转换为元组数组

我使用pandas操作了一些数据,现在我想执行批量保存到数据库。 这要求我将数据框转换为一个元组数组,每个元组对应一个数据框的“行”。

我的DataFrame看起来像这样:

In [182]: data_set Out[182]: index data_date data_1 data_2 0 14303 2012-02-17 24.75 25.03 1 12009 2012-02-16 25.00 25.07 2 11830 2012-02-15 24.99 25.15 3 6274 2012-02-14 24.68 25.05 4 2302 2012-02-13 24.62 24.77 5 14085 2012-02-10 24.38 24.61 

我想将它转换为一个元组数组,如下所示:

 [(datetime.date(2012,2,17),24.75,25.03), (datetime.date(2012,2,16),25.00,25.07), ...etc. ] 

任何有关如何有效地做到这一点的build议?

怎么样:

 subset = data_set[['data_date', 'data_1', 'data_2']] tuples = [tuple(x) for x in subset.values] 

通用的方法:

 [tuple(x) for x in data_set.to_records(index=False)] 
 list(data_set.itertuples(index=False)) 

从17.1开始,上面将返回一个namedtuples列表。

这是一个vector化的方法(假设data_setdata_set被定义为df ),它返回一个tuples list ,如下所示:

 >>> df.set_index(['data_date'])[['data_1', 'data_2']].to_records().tolist() 

生产:

 [(datetime.datetime(2012, 2, 17, 0, 0), 24.75, 25.03), (datetime.datetime(2012, 2, 16, 0, 0), 25.0, 25.07), (datetime.datetime(2012, 2, 15, 0, 0), 24.99, 25.15), (datetime.datetime(2012, 2, 14, 0, 0), 24.68, 25.05), (datetime.datetime(2012, 2, 13, 0, 0), 24.62, 24.77), (datetime.datetime(2012, 2, 10, 0, 0), 24.38, 24.61)] 

将datetime列设置为索引轴的想法是通过使用DF.to_records中的convert_datetime64参数来帮助将Timestamp值转换为其相应的datetime.datetime格式,这对于DateTimeIndex数据DF.to_records是这样做的。

这将返回一个recarray ,然后可以使用.tolist返回一个list


更广泛的解决scheme取决于使用情况将是:

 df.to_records().tolist() # Supply index=False to exclude index 

动机
许多数据集足够大,我们需要关心速度/效率。 所以我以这种精神提供这个解决scheme。 它恰好也是简洁的。

为了比较,我们放下index

 df = data_set.drop('index', 1) 


我会build议使用zip和理解

 list(zip(*[df[c].values.tolist() for c in df])) [('2012-02-17', 24.75, 25.03), ('2012-02-16', 25.0, 25.07), ('2012-02-15', 24.99, 25.15), ('2012-02-14', 24.68, 25.05), ('2012-02-13', 24.62, 24.77), ('2012-02-10', 24.38, 24.61)] 

如果我们想要处理一个特定的列子集,它也是灵活的。 我们假设我们已经显示的列是我们想要的子集。

 list(zip(*[df[c].values.tolist() for c in ['data_date', 'data_1', 'data_2'])) [('2012-02-17', 24.75, 25.03), ('2012-02-16', 25.0, 25.07), ('2012-02-15', 24.99, 25.15), ('2012-02-14', 24.68, 25.05), ('2012-02-13', 24.62, 24.77), ('2012-02-10', 24.38, 24.61)] 

以下全部产生相同的结果

  • [tuple(x) for x in df.values]
  • df.to_records(index=False).tolist()
  • list(map(tuple,df.values))
  • list(map(tuple, df.itertuples(index=False)))

什么更快?
zip和理解速度更快

 %timeit [tuple(x) for x in df.values] %timeit list(map(tuple, df.itertuples(index=False))) %timeit df.to_records(index=False).tolist() %timeit list(map(tuple,df.values)) %timeit list(zip(*[df[c].values.tolist() for c in df])) 

小数据

 10000 loops, best of 3: 55.7 µs per loop 1000 loops, best of 3: 596 µs per loop 10000 loops, best of 3: 38.2 µs per loop 10000 loops, best of 3: 54.3 µs per loop 100000 loops, best of 3: 12.9 µs per loop 

大数据

 10 loops, best of 3: 58.8 ms per loop 10 loops, best of 3: 43.9 ms per loop 10 loops, best of 3: 29.3 ms per loop 10 loops, best of 3: 53.7 ms per loop 100 loops, best of 3: 6.09 ms per loop 

更pythonic的方式:

 df = data_set[['data_date', 'data_1', 'data_2']] map(tuple,df.values) 
 #try this one: tuples = list(zip(data_set["data_date"], data_set["data_1"],data_set["data_2"])) print (tuples)