Python 将系列拆分为多列
我正在从数据库中提取大量条目(>1500万条条目),目标是导出到CSV文件。我在请求的末尾得到的是一个超过1500万行的单列数据帧。我正在寻找一个函数,每一百万个条目将条目分割成多列 所以对于一个500万条目的专栏,我希望有5个专栏,每个专栏有100万条Python 将系列拆分为多列,python,pandas,Python,Pandas,我正在从数据库中提取大量条目(>1500万条条目),目标是导出到CSV文件。我在请求的末尾得到的是一个超过1500万行的单列数据帧。我正在寻找一个函数,每一百万个条目将条目分割成多列 所以对于一个500万条目的专栏,我希望有5个专栏,每个专栏有100万条 提前谢谢 最丑的代码线奖颁给 x = 1000000 pd.concat([pd.DataFrame(np.array(df[df.columns[0]].tolist())[:-(len(df)%x )].reshape(len(df)//x
提前谢谢 最丑的代码线奖颁给
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混在一起;) 最丑的代码线奖颁给
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混在一起;) 我同意@EdChum的观点,如果给定一个名为
s
的系列对象,这将是最简单的:
d = pd.DataFrame(s.values.reshape(1000000, -1))
这将把您的系列重新塑造成一个数据框架的形状(1000000,s.len/1000000)
但是,只有当序列的长度是1000000的精确倍数时,上述方法才有效。或者,您可以执行以下操作:
# 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…
应该比列表理解更快lambda x:(x//N,x%N)
我同意@EdChum的观点,如果给定一个名为
s
的系列对象,这将是最简单的:
d = pd.DataFrame(s.values.reshape(1000000, -1))
这将把您的系列重新塑造成一个数据框架的形状(1000000,s.len/1000000)
但是,只有当序列的长度是1000000的精确倍数时,上述方法才有效。或者,您可以执行以下操作:
# 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…
应该比列表理解更快lambda x:(x//N,x%N)
您可以
重塑
df值:pd.DataFame(df.values.reformate(1000000,5))
这可能是您的问题的有趣答案:您可以重塑
df值:pd.DataFame(df.values.reformate(1000000,5))
对于您的问题,这可能是一个有趣的答案:我从Python尝试这个问题时得到一个内存错误。我猜它吃得太多了!我从Python那里得到了一个内存错误。我猜它吃得太多了!我测试了它,但没有得到与前面提到的相同的输出。而不是1,2,3等,我有0.0,0.1,0.2列。我遗漏了什么吗?你测试了哪种方法?您的系列索引是否从0开始并增加到len(系列)-1?我使用了您在使用的示例中提到的两种方法above@John_Mtl,您正在使用Python 3吗?如果是,请参见上面的小编辑;您需要在lambda函数中使用整数除法/
。感谢您的编辑和时间,它现在可以完美地工作了!我测试了它,但没有得到与前面提到的相同的输出。而不是1,2,3等,我有0.0,0.1,0.2列。我遗漏了什么吗?你测试了哪种方法?您的系列索引是否从0开始并增加到len(系列)-1?我使用了您在使用的示例中提到的两种方法above@John_Mtl,您正在使用Python 3吗?如果是,请参见上面的小编辑;您需要在lambda函数中使用整数除法/
。感谢您的编辑和时间,它现在可以完美地工作了!