我从数据库中提取大量条目(> 15百万条目),目标是导出为CSV文件。我在请求结束时得到的是一个包含超过1500万行的单列数据帧。我正在寻找一个函数,将条目分成每百万个条目的多个列。
因此,对于一个500万条目的栏目,我希望有5列,每列100万条。
提前致谢!
答案 0 :(得分:3)
我同意@EdChum,鉴于名为s
的Series对象,这将是最简单的:
d = pd.DataFrame(s.values.reshape(1000000, -1))
会将您的系列重塑为形状(1,000,000, s.len / 1,000,000)
的数据框。
但是,只有长度为1,000,000的精确倍数的系列才能使用上述功能。或者,您可以执行以下操作:
# note with python3, you need to use integer division // here
s.index = pd.MultiIndex.from_tuples([(x/1000000,x%1000000) for x in s.index])
# or an alternative below which does the same thing
#s.index = pd.MultiIndex.from_tuples(s.index.map(lambda x: (x/1000000, x%1000000)))
s.unstack(0)
将为您提供相同长度的多列,最后一列填充NaN
s。
这是一个长度为55的系列示例,我希望将其拆分为长度为10的列。请注意,最后一列的最后5个值设置为NaN
:
In [42]: s = pd.Series(np.arange(55))
In [43]: s
Out[43]:
0 0
1 1
2 2
...
53 53
54 54
dtype: int64
# with python3 x//10, x%10
In [44]: s.index = pd.MultiIndex.from_tuples(s.index.map(lambda x: (x/10, x%10)))
In [45]: s.unstack(0)
Out[45]:
0 1 2 3 4 5
0 0 10 20 30 40 50
1 1 11 21 31 41 51
2 2 12 22 32 42 52
3 3 13 23 33 43 53
4 4 14 24 34 44 54
5 5 15 25 35 45 NaN
6 6 16 26 36 46 NaN
7 7 17 27 37 47 NaN
8 8 18 28 38 48 NaN
9 9 19 29 39 49 NaN
注意两件事:
对于非常大的数组,使用s.index.map(lambda ...)
应该比列表理解更快。
如果使用python3,请确保在lambda函数中使用整数除法:lambda x: (x // N, x % N)
。
答案 1 :(得分:0)
最丑陋的代码奖授予....
x = 1000000
pd.concat([pd.DataFrame(np.array(df[df.columns[0]].tolist())[:-(len(df)%x )].reshape(len(df)//x, x)), pd.DataFrame(df[df.columns[0]].tolist()[len(df) - len(df)%x:])] , axis=1)
您应该为x的任何值设置。毫无疑问,东西可以100%漂亮,只是搞乱了ipython;)