1

我想展示一个将两个 DataFrame 与条件索引相结合的表格。这适用于一个 DataFrame:

room1,weather = pd.read_excel(mypath,sheetnames[0]),pd.read_excel(mypath,sheetnames[2])
selector = (room1.Time>='08:00') & (room1.Time<='18:00')
view     = ['Time','Cooling_plant_sensible_load']
room1[selector][view][:12]

这给了我这样的东西:

    Time    Cooling_plant_sensible_load
7   08:00   0.000
8   09:00   0.000
....
16  17:00   0.000
17  18:00   0.000
31  08:00   0.000

weatherDataFrame 有一个名为的系列,Dry_Bulb_Temperature我想将其添加到视图中,因此它显示如下

    Time    Cooling_plant_sensible_load    Dry_Bulb_Temperature
7   08:00   0.000                          18
8   09:00   0.000                          22
....
16  17:00   0.000                          19
17  18:00   0.000                          16
31  08:00   0.000                          12

我尝试添加:

selector2 = (weather.Time>='08:00') & (weather.Time<='18:00')
pd.concat({'room1':room1[selector][view][:12],'wea':weather[selector2]['Dry_bulb_temperature']},axis=1)

这给了我一个AttributeError: 'Series' object has no attribute '_data'

编辑:

weather[selector2]['Dry_bulb_temperature'][:12]看起来像这样:

major
7        15.3
8        16.0
9        18.0
10       19.9
11       21.9
12       22.9
13       24.0
14       25.0
15       24.8
16       24.5
17       24.3
31       16.2
Name: Dry_bulb_temperature, dtype: float64

编辑2:

原因是AttributeError: 'Series' object has no attribute '_data'因为weather[selector2]['Dry_bulb_temperature']是一个系列而 concat 需要一个 DataFrame不能与 Dataframe 连接,即 concat 需要两种相似的类型(前面的评论是错误的,正如下面@Philip 指出的那样)。

所以我可以将 room1 数据帧与天气数据帧结合起来。这是要走的路吗?如何避免两个“时间”系列重复?

我有许多房间(n)个数据框,并且正在考虑每个可能有一种方法来引用相同的天气数据集。

4

3 回答 3

1

看起来您想要进行连接(可以在其索引上合并 DataFrame 和 Series):

In [11]: df
Out[11]:
    Time  Cooling_plant_sensible_load  Dry_Bulb_Temperature
7  08:00                            0                    18
8  09:00                            0                    22

In [12]: s
Out[12]:
7    15.3
8    16.0
Name: Dry_bulb_temperature, dtype: float64

In [13]: df.join(s)
Out[13]:
    Time  Cooling_plant_sensible_load  Dry_Bulb_Temperature  Dry_bulb_temperature
7  08:00                            0                    18                  15.3
8  09:00                            0                    22                  16.0

在文档的合并、加入和连接部分中查看更多信息。

笔记:

您可以使用 loc 创建系列/列,避免链接:

s = weather.loc[selector2, 'Dry_bulb_temperature']
于 2013-09-07T08:46:18.467 回答
1

我不确定你的 concat 中发生了什么。可能是您混淆了字段名称。我在您问题的不同部分同时看到了“Dry_Bulb_Temperature”和“Dry_bulb_temperature”。

假设这两个数据帧具有相同的索引,我会连接整个事情,然后做你的过滤器:

df = pd.concat([room1, weather[['Dry_Bulb_Temperature']]], axis=1)
df[(df['Time'] >= '08:00') & (df['Time'] <= '18:00')]

更少的代码,更容易阅读。

于 2013-09-07T04:51:35.470 回答
0

好的,我得到了一些基于@mattexx 初始提案的东西:

#pd.concat([room1, weather], axis=1)[selector][view.append('Dry_bulb_temperature')]
df = pd.concat([room1, weather], axis=1)


# Removing duplicate columns based on this link:
# http://stackoverflow.com/questions/16938441/how-to-remove-duplicate-columns-from-a-dataframe-using-python-pandas

df = df.T.groupby(level=0).first().T
selector = [(df.Time>='08:00') & (df.Time<='18:00')]
view     = ['Time','Cooling_plant_sensible_load','Dry_bulb_temperature']
df[['Time','Cooling_plant_sensible_load','Dry_bulb_temperature']][(df.Time>='08:00') & (df.Time<='18:00')][:12]

这使:

    Time    Cooling_plant_sensible_load     Dry_bulb_temperature
7   08:00   0   15.3
8   09:00   0   16
.......................
17  18:00   0   24.3
31  08:00   0   16.2

不确定这是否是到达那里的最佳方式,但目前可行。谢谢你们让我走上正轨。

于 2013-09-07T07:02:27.007 回答