我已经使用pandas操纵了一些数据,现在我想进行批量保存回数据库。这需要我将数据帧转换为一个元组数组,每个元组对应于数据帧的“行”。

我的数据帧看起来像这样:

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. ]

有什么建议吗?


当前回答

更python化的方式:

df = data_set[['data_date', 'data_1', 'data_2']]
map(tuple,df.values)

其他回答

如何:

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

对于熊猫< 0.24使用

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开始,上面的代码将返回一个命名元组列表。

如果你想要一个普通元组的列表,传递name=None作为参数:

list(data_set.itertuples(index=False, name=None))

将数据帧列表更改为元组列表。

df = pd.DataFrame({'col1': [1, 2, 3], 'col2': [4, 5, 6]})
print(df)
OUTPUT
   col1  col2
0     1     4
1     2     5
2     3     6

records = df.to_records(index=False)
result = list(records)
print(result)
OUTPUT
[(1, 4), (2, 5), (3, 6)]

下面是一个矢量化的方法(假设dataframe, data_set被定义为df),它返回一个元组列表,如下所示:

>>> 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列设置为索引轴的想法是帮助将Timestamp值转换为相应的datetime。通过使用DF中的convert_datetime64参数来等效datetime格式。to_records用于DateTimeIndex数据帧。

这将返回一个重数组,然后可以使用.tolist返回一个列表


根据用例,更通用的解决方案是:

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