Python 将系列拆分为多列

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

我正在从数据库中提取大量条目(>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)), 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…
    应该比列表理解更快

  • 如果使用python3,请确保在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…
    应该比列表理解更快

  • 如果使用python3,请确保在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函数中使用整数除法
    /
    。感谢您的编辑和时间,它现在可以完美地工作了!