如何从数组系列构建pandas数据框架(DataFrame)

14

你好,我有以下的 Pandas Series,包含了 NumPy 数组:

 datetime
    03-Sep-15     [53.5688348969, 31.2542494769, 18.002043765]
    04-Sep-15     [46.845084292, 27.0833015735, 15.5997887379]
    08-Sep-15    [52.8701581666, 30.7347431703, 17.6379377917]
    09-Sep-15    [47.9535624339, 27.7063099999, 15.9126963643]
    10-Sep-15     [51.2900606534, 29.600945626, 16.8756260105]

你知道我如何将它转换成一个有3列的数据框吗?谢谢!


你真正拥有什么?一个单一的系列吗? - Anand S Kumar
1
是的,没错。现在这是一个数组序列。 - NickD1
你是如何创建的?请发布一个可运行的示例。 - Anand S Kumar
让我回到这个问题。因为我刚意识到数组中有一些NaN被视为单行。暂时不要花时间在它上面。 - NickD1
2个回答

18

将一个列表的列表馈送给pd.DataFrame是一种更高效的方法:

s = pd.Series([np.array([53.5688348969, 31.2542494769, 18.002043765]),
               np.array([46.845084292, 27.0833015735, 15.5997887379]),
               np.array([52.8701581666, 30.7347431703, 17.6379377917]),
               np.array([47.9535624339, 27.7063099999, 15.9126963643]),
               np.array([51.2900606534, 29.600945626, 16.8756260105])],
              index=['03-Sep-15', '04-Sep-15', '08-Sep-15', '09-Sep-15', '10-Sep-15'])

df = pd.DataFrame(s.values.tolist(), index=s.index)

print(df)

                   0          1          2
03-Sep-15  53.568835  31.254249  18.002044
04-Sep-15  46.845084  27.083302  15.599789
08-Sep-15  52.870158  30.734743  17.637938
09-Sep-15  47.953562  27.706310  15.912696
10-Sep-15  51.290061  29.600946  16.875626

基准测试Python 3.6 / Pandas 0.19:

%timeit pd.DataFrame(s.values.tolist(), index=s.index)  # 448 µs per loop
%timeit s.apply(pd.Series)                              # 1.5 ms per loop

至少在我的情况下不是这样的:2.88秒±40.9毫秒每次循环(平均值±7次运行的标准差,每次循环1次) <magic-timeit>:1: FutureWarning: 当提供的函数返回一个Series时,从Series.apply返回DataFrame已被弃用,并将在将来的版本中删除。 851毫秒±5.45毫秒每次循环(平均值±7次运行的标准差,每次循环1次) - undefined

7

它的性能不会非常高,但你应该能够 apply(pd.Series):

>>> ser
03-Sep-15     [53.5688348969, 31.2542494769, 18.002043765]
04-Sep-15     [46.845084292, 27.0833015735, 15.5997887379]
08-Sep-15    [52.8701581666, 30.7347431703, 17.6379377917]
09-Sep-15    [47.9535624339, 27.7063099999, 15.9126963643]
10-Sep-15     [51.2900606534, 29.600945626, 16.8756260105]
dtype: object
>>> type(ser.values[0])
<class 'numpy.ndarray'>
>>> ser.apply(pd.Series)
                   0          1          2
03-Sep-15  53.568835  31.254249  18.002044
04-Sep-15  46.845084  27.083302  15.599789
08-Sep-15  52.870158  30.734743  17.637938
09-Sep-15  47.953562  27.706310  15.912696
10-Sep-15  51.290061  29.600946  16.875626

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接