【问题标题】:Extracting data from Pandas dataframe as dataframe从 Pandas 数据框中提取数据作为数据框
【发布时间】:2013-10-16 14:00:52
【问题描述】:

我在 Python 的 Pandas 中遇到的最大问题之一是持续默认为 pandas.core.series.Series 类型。例如

import numpy as np
import pandas as pd

a = pd.DataFrame( np.random.randn(5,5),columns=list('ABCDE') )
b = a.mean(axis=0)

>>> b
    A    0.399677
    B    0.080594
    C    0.060423
    D   -1.206630
    E    0.153359
    dtype: float64

>>> type(b)
<class 'pandas.core.series.Series'>

所以,如果我尝试插入新的数据框,我会遇到各种错误(即尺寸不匹配等)。在我看来,当我对数据框执行操作时,输出应该是数据框,而不是系列。有没有人对如何使用有建议,例如df.mean(),并返回一个数据框?

开始编辑 抱歉,我应该提供更多详细信息。
我想选择性地平均原始数据帧的切片,并将这些平均值插入单独的数据帧。

# This is how I've been trying to do it
# Using <a> from above
b = pd.DataFrame()

# Select out data from original data frame
tmp = a(a.A>5).mean() # Just an example, this is not really my selection criteria

# Now I want to store these averaged values in my aggregated data frame.  
b = pd.concat( [b,tmp] )

我想我真正的问题是:如何平均一个数据帧中的数据并将其传递到另一个数据帧进行存储? 结束编辑

编辑拍摄 2 我有两个数据集(都存储为数据帧),它们都是时间序列。两个时间序列都有不规则的时间戳:一个每 90 秒有一个时间戳(在 0700 - 2000 小时之间),另一个每天有一个或两个时间戳(卫星立交桥数据)。没有一个时间戳是规则的(即它们很少同时出现,而且它们很少以小时或半小时为中心等)。我的目标是获取我的高频数据并以卫星的时间戳(+/- 30 分钟)为中心对其进行平均,然后将平均数据存储在一个新的数据帧中。这是我到目前为止编写的实际代码:

# OMI is the satellite data, ~daily resolution
# Pan is surface data, with 90s resolution

# Example data: 
>>> pan.head()
                        hcho     h2o      so2      o3       no2
2010-06-24 14:01:20  0.87784  2.9947      NaN     NaN  0.671104
2010-06-24 14:03:52  0.68877  3.0102      NaN     NaN  0.684615
2010-06-24 14:04:35      NaN     NaN  0.58119  285.76       NaN
2010-06-24 14:05:19  0.75813  3.0218      NaN     NaN  0.693880
2010-06-24 14:06:02      NaN     NaN  0.40973  286.00       NaN

>>> omi.head()
                    ctp  dist           no2        no2std     cf  
2010-06-24 17:51:43    7  23.8  5.179200e+15  1.034600e+15  0.001   
2010-06-26 17:39:34    3   7.0  7.355800e+15  1.158100e+15  0.113   
2010-07-01 17:57:40    9   8.4  5.348300e+15  9.286100e+14  0.040   
2010-07-03 17:45:30    5  32.2  5.285300e+15  8.877800e+14  0.000   

# Code
out = pd.DataFrame()

width = 30 # Defined earlier, input of function
for r in omi.index:
    # Define datetime limits
    d1 = r - dt.timedelta(minutes=width)
    d2 = r + dt.timedelta(minutes=width)
    tmp = pan.truncate(d1,d2).mean(axis=0,skipna=True)

    if tmp.nunique()<>0: # Ensuring there is something in <tmp>
        tmp = pd.DataFrame(tmp,index=[r],columns=pan.columns)
        out = pd.concat([out,tmp],axis=0,ignore_index=False)

【问题讨论】:

  • df.mean() 是一个归约操作,根据定义,它将在指定的维度上进行聚合,将返回对象的维度减少 1
  • 我同意@Jeff,不确定你的问题是什么,这些聚合返回一个系列是有道理的
  • 只要结果可以是broadcasted,您就可以这样做a['mean'] = a.mean(),您是否真的要将结果连接为新行而不是新列?
  • @EdChum 是的,我确定。让我在第二次编辑中讲述整个故事......
  • @tnknepp 你可以将mean() 传递给DataFrame 的构造函数concat 就像b = pd.concat(b, DataFrame(a(a.A&gt;5).mean())) 一样,虽然这不起作用我认为你想要a.loc[a.A&gt;5]?跨度>

标签: python pandas


【解决方案1】:

您可以像这样轻松地从系列中构造一个 DataFrame:

c = DataFrame(a.mean(axis=0), columns=['mean'])
c

Out[91]:
       mean
A -0.210582
B -0.742551
C  0.347408
D  0.276034
E  0.399468

我还是看不出这对你来说真的比原来返回的系列更好吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2021-01-07
    • 1970-01-01
    • 2019-11-06
    • 2017-10-01
    • 1970-01-01
    • 2019-03-16
    相关资源
    最近更新 更多