将熊猫系列分成多个列

时间:2016-05-04 14:18:46

标签: python pandas

我从数据库中提取大量条目(> 15百万条目),目标是导出为CSV文件。我在请求结束时得到的是一个包含超过1500万行的单列数据帧。我正在寻找一个函数,将条目分成每百万个条目的多个列。

因此,对于一个500万条目的栏目,我希望有5列,每列100万条。

提前致谢!

2 个答案:

答案 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

注意两件事:

  1. 对于非常大的数组,使用s.index.map(lambda ...)应该比列表理解更快。

  2. 如果使用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;)