【问题标题】:How to construct pandas dataframe from series of arrays如何从一系列数组构造熊猫数据框
【发布时间】:2015-12-12 04:28:21
【问题描述】:

您好,我有以下 pandas 系列的 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 列的数据框吗?谢谢!

【问题讨论】:

  • 你真正拥有什么?一个系列?
  • 是的,完全正确。现在这是一系列数组。
  • 你是如何创建它的?请发布一个可运行的示例。
  • 让我回到这个话题。因为我刚刚意识到该数组有一些被视为单行的 NaN。暂时不要花时间。

标签: python arrays pandas numpy dataframe


【解决方案1】:

将列表提供给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】:

    它不会是超级性能,但你应该可以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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 2020-11-25
      相关资源
      最近更新 更多