Python 3.x 将熊猫系列转换为数据帧

Python 3.x 将熊猫系列转换为数据帧,python-3.x,pandas,Python 3.x,Pandas,我有一个熊猫系列,我正试图转换成一个数据帧。该系列为1列30行。我希望从索引0开始,每三个元素取一个,并使其成为新数据帧的第一列。然后我想取从索引1开始的每三个元素,使其成为新数据帧的第二列。然后我想取从索引2开始的每三个元素,使其成为新数据帧的第三列 我的熊猫系列是: dfTMP Out[65]: 1 14584416 2 96 3 2845 4 14112187 5 96 6 1629 7 12

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

我的熊猫系列是:

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
这段代码只创建第一个col(或者实际上是我首先复制的序列的切片)

  • 为什么上面的代码不适用于所有COL?我在第一列之后得到nan
  • 正确的方法是什么

  • 谢谢

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

    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'])
    

    只需调用
    上的
    重塑
    即可重塑
    系列的numpy数组
    。值
    传入所需的新维度,并将数组传递给
    数据帧
    选择器:

    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是空的。您不能使用此方法增长或附加到df,除非您
    reindex
    预先分配行,
    append
    显式附加行,或者执行一个。

    仅添加到池中:

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

    加1,用于在NumPy world中执行转换。为了更加通用,您可以使用
    -1
    作为
    重塑的第一个参数
    @jpp感谢您的更新,不喜欢蚕食其他答案,所以添加了信任。您更喜欢
    .restrape(-1,3)
    方法,而不是我的显式
    len
    answer@EdChum:在我的机器上,两种方式都可以工作,我用OP的样本输入进行了测试。效率太低了。@JohnZwinck当然是,比其他人慢得多,但完成了这项工作:)