【问题标题】:pandas: Convert Series of DataFrames to single DataFramepandas:将一系列 DataFrame 转换为单个 DataFrame
【发布时间】:2015-08-08 20:50:23
【问题描述】:

我有一个 pandas Series 对象,每个值都是一个 DataFrame。我正在尝试将其转换为单个DataFrame,其中所有Series 值(单个DataFrame)堆叠在一起。如何在没有循环的情况下实现这一点?

下面的玩具示例用于生成测试对象 (results)。

import pandas as pd
import numpy as np
numrows = 10000

def toy_function(x):
    silly_sequence = np.random.uniform(10, 100, (x+1))
    toy = pd.DataFrame({'ID':pd.Series(np.random.random_integers(1,20,3)),'VALUE':pd.Series((np.median(silly_sequence),np.mean(silly_sequence), np.max(silly_sequence)))})

    return toy

results = pd.DataFrame({'ID':range(numrows)})['ID'].apply(toy_function)

results 属于Series 类型,每个元素都是DataFrame,如下所示:

In [1]: results[1]
Out[1]: 
   ID      VALUE
0  17  40.035398
1   8  40.035398
2  20  66.483083

我正在寻找一种将results[1]results[2] 等相互堆叠以产生如下 DataFrame 的方法:

   ID      VALUE
0  17  40.035398
1   8  40.035398
2  20  66.483083
4  12  25.035398
5   1  25.135398
6  19  65.553083
...

【问题讨论】:

    标签: python pandas append


    【解决方案1】:

    尝试使用pd.concat。至少,pd.concat(series.values.tolist()) 应该可以工作。

    它的默认设置是获取 pandas 数据帧或系列的列表,并将它们端到端地返回。 http://pandas.pydata.org/pandas-docs/stable/merging.html

    【讨论】:

    • 不需要.values。你可以通过series.tolist()
    • 如果我想扩展/保存原始索引并且DF具有不同的长度怎么办?
    • 我尝试了这个有一些空数据框的解决方案,不幸的是 concat 删除了那些空数据框。我的解决方案是在执行 concat 操作之前用 nans 填充这些数据帧。像这样:如果 len(data) == 0: data = data.append(dict(zip(data.columns, [np.NaN]*data.shape[1])), ignore_index=True)
    【解决方案2】:

    连接结果并在这样做时忽略您的索引:

    df_stacked = pd.concat([r for r in results], ignore_index=True)
    

    【讨论】:

      猜你喜欢
      • 2019-11-28
      • 2018-02-02
      • 2019-10-27
      • 1970-01-01
      • 2017-03-17
      • 2017-03-23
      • 2015-03-23
      • 2021-07-27
      • 2018-04-18
      相关资源
      最近更新 更多