我有一个熊猫系列,试图将其转换为数据框。该系列是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
此代码仅创建第一个列(或实际上是我首先复制的系列的切片)。
谢谢
答案 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)