Python 3.x 将熊猫系列转换为数据帧
我有一个熊猫系列,我正试图转换成一个数据帧。该系列为1列30行。我希望从索引0开始,每三个元素取一个,并使其成为新数据帧的第一列。然后我想取从索引1开始的每三个元素,使其成为新数据帧的第二列。然后我想取从索引2开始的每三个元素,使其成为新数据帧的第三列 我的熊猫系列是: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
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(或者实际上是我首先复制的序列的切片)
谢谢由于索引错误,您的原始代码无法工作。您可以通过删除索引并仅使用值来修复它,如下所示:
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当然是,比其他人慢得多,但完成了这项工作:)