将熊猫系列转换为数据框

时间:2018-07-17 12:58:08

标签: python-3.x pandas

我有一个熊猫系列,试图将其转换为数据框。该系列是1列和30行。我想获取从索引0开始的每三个元素,并使其成为新数据帧的第一个col。然后我要从索引1开始的每个第三个元素作为新数据帧的第二个col,然后我要从索引2开始的每个第三个元素作为新数据帧的第三个col。

我的熊猫系列是:

dfTMP
Out[65]: 
1     14584416
2           96
3         2845
4     14112187
5           96
6         1629
7     12312225
8           77
9         4165
10    13466612
11          45
12        4146
13    12651673
14          27
15        1791
16    12565436
17          26
18        2956
19    14362965
20          26
21        3714
22    12352162
23          25
24        1689
25    12059502
26          25
27        2612
28    11659730
29          22
30        3771
Name: 4, dtype: int64

我尝试了以下操作:

    dfNEW = pd.DataFrame(columns = ['appID', 'rel', 'au']) # creates empty dataframe
    dfNEW['appID'] = dfTMP.iloc[0::3] # starting at 0, takes every 3rd element
    dfNEW['rel'] = dfTMP.iloc[1::3] # starting at 1, takes every 3rd element
    dfNEW['au'] = dfTMP.iloc[2::3] # starting at 2, takes every 3rd element

此代码仅创建第一个列(或实际上是我首先复制的系列的切片)。

  1. 以上代码为什么不适用于所有cols?在第一个列之后,我得到了nan的列。
  2. 执行此操作的正确方法是什么?

谢谢

3 个答案:

答案 0 :(得分:4)

只需通过reshape上的Series调用reshape的numpy数组,传入所需的新尺寸,然后将该数组传递给.values ctor :

DataFrame

关于为什么它不起作用In[12]: dfNEW = pd.DataFrame(s.values.reshape((10,3)),columns = ['appID', 'rel', 'au']) dfNEW Out[12]: appID rel au 0 14584416 96 2845 1 14112187 96 1629 2 12312225 77 4165 3 13466612 45 4146 4 12651673 27 1791 5 12565436 26 2956 6 14362965 26 3714 7 12352162 25 1689 8 12059502 25 2612 9 11659730 22 3771 的原因是您没有现有索引,因此它无法与另一个df对齐,此外,您的初始df为空。除非您pandas来预分配行,reindex来显式地追加行,或者执行setting with enlargement,否则不能使用此方法来增大或追加到df。

答案 1 :(得分:2)

您的原始代码无效,因为索引错误。您可以通过删除索引并仅使用值来修复它,如下所示:

dfNEW = pd.DataFrame(columns = ['appID', 'rel', 'au']) # creates empty dataframe
dfNEW['appID'] = dfTMP.iloc[0::3].values
# and so on

但是在类似您的示例的情况下,更紧凑的方法是:

dfNEW = pd.DataFrame(dfTMP.values.reshape(-1,3), columns=['appID', 'rel', 'au'])

答案 2 :(得分:0)

只需添加到池中即可:

dfNEW = pd.DataFrame()
dfNEW[['appID', 'rel', 'au']] = dfTMP.groupby(by=lambda x: x/3, axis=0).apply(tuple).apply(pd.Series)