簡體   English   中英

將熊貓系列分成多個列

[英]Splitting pandas series into multiple columns

我正在從數據庫中提取大量條目(> 15百萬條目),目的是導出到CSV文件。 我在請求結束時得到的是一個包含超過1500萬行的單列數據幀。 我正在尋找一個函數來將條目分成每百萬個條目的多個列。

因此,對於一個500萬條目的欄目,我想擁有5列,每列100萬個條目。

提前致謝!

我同意@EdChum,鑒於名為s的Series對象,這將是最簡單s

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填充。

這是一個長度為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)

而最丑陋的代碼獎項就是....

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM