我已经使用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. ]

有什么建议吗?


当前回答

这个答案没有添加任何尚未讨论过的答案,但这里有一些速度结果。我认为这应该能解决评论中出现的问题。根据这三个值,它们看起来都是O(n)

DR: tuples = list(df. list)itertuples(index=False, name=None))和tuples = list(zip(*[df[c].values.tolist() for c in df])))是并列最快的。

我对结果做了一个快速测试,有三个建议:

@pirsquared: tuples = list(zip(*[df[c].values.tolist() for c in df])) 来自@wes-mckinney的接受答案:tuples =[在df.values中x的元组(x)] itertuples回答来自@ksindi的name=Noneitertuples(指数= False, name =))

from numpy import random
import pandas as pd


def create_random_df(n):
    return pd.DataFrame({"A": random.randint(n, size=n), "B": random.randint(n, size=n)})

小尺寸:

df = create_random_df(10000)
%timeit tuples = list(zip(*[df[c].values.tolist() for c in df]))
%timeit tuples = [tuple(x) for x in df.values]
%timeit tuples = list(df.itertuples(index=False, name=None))

给:

1.66 ms ± 200 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
15.5 ms ± 1.52 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
1.74 ms ± 75.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

大:

df = create_random_df(1000000)
%timeit tuples = list(zip(*[df[c].values.tolist() for c in df]))
%timeit tuples = [tuple(x) for x in df.values]
%timeit tuples = list(df.itertuples(index=False, name=None))

给:

202 ms ± 5.91 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
1.52 s ± 98.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
209 ms ± 11.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

和我一样有耐心:

df = create_random_df(10000000)
%timeit tuples = list(zip(*[df[c].values.tolist() for c in df]))
%timeit tuples = [tuple(x) for x in df.values]
%timeit tuples = list(df.itertuples(index=False, name=None))

给:

1.78 s ± 118 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
15.4 s ± 222 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
1.68 s ± 96.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

zip版本和itertuples版本在彼此的置信区间内。我怀疑他们在幕后也在做同样的事情。

不过,这些速度测试可能无关紧要。挑战计算机内存的极限并不需要花费大量的时间,而且您确实不应该在大型数据集上这样做。在此之后使用这些元组将会非常低效。它不太可能成为您代码中的主要瓶颈,所以只需坚持使用您认为最易读的版本。

其他回答

这个答案没有添加任何尚未讨论过的答案,但这里有一些速度结果。我认为这应该能解决评论中出现的问题。根据这三个值,它们看起来都是O(n)

DR: tuples = list(df. list)itertuples(index=False, name=None))和tuples = list(zip(*[df[c].values.tolist() for c in df])))是并列最快的。

我对结果做了一个快速测试,有三个建议:

@pirsquared: tuples = list(zip(*[df[c].values.tolist() for c in df])) 来自@wes-mckinney的接受答案:tuples =[在df.values中x的元组(x)] itertuples回答来自@ksindi的name=Noneitertuples(指数= False, name =))

from numpy import random
import pandas as pd


def create_random_df(n):
    return pd.DataFrame({"A": random.randint(n, size=n), "B": random.randint(n, size=n)})

小尺寸:

df = create_random_df(10000)
%timeit tuples = list(zip(*[df[c].values.tolist() for c in df]))
%timeit tuples = [tuple(x) for x in df.values]
%timeit tuples = list(df.itertuples(index=False, name=None))

给:

1.66 ms ± 200 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
15.5 ms ± 1.52 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
1.74 ms ± 75.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

大:

df = create_random_df(1000000)
%timeit tuples = list(zip(*[df[c].values.tolist() for c in df]))
%timeit tuples = [tuple(x) for x in df.values]
%timeit tuples = list(df.itertuples(index=False, name=None))

给:

202 ms ± 5.91 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
1.52 s ± 98.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
209 ms ± 11.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

和我一样有耐心:

df = create_random_df(10000000)
%timeit tuples = list(zip(*[df[c].values.tolist() for c in df]))
%timeit tuples = [tuple(x) for x in df.values]
%timeit tuples = list(df.itertuples(index=False, name=None))

给:

1.78 s ± 118 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
15.4 s ± 222 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
1.68 s ± 96.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

zip版本和itertuples版本在彼此的置信区间内。我怀疑他们在幕后也在做同样的事情。

不过,这些速度测试可能无关紧要。挑战计算机内存的极限并不需要花费大量的时间,而且您确实不应该在大型数据集上这样做。在此之后使用这些元组将会非常低效。它不太可能成为您代码中的主要瓶颈,所以只需坚持使用您认为最易读的版本。

最有效和最简单的方法:

list(data_set.to_records())

您可以在此调用之前筛选所需的列。

如何:

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]
#try this one:

tuples = list(zip(data_set["data_date"], data_set["data_1"],data_set["data_2"]))
print (tuples)

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

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