我想展示一个将两个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
weather
DataFrame有一个名为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
EDIT2:
导致AttributeError: 'Series' object has no attribute '_data'
是因为weather[selector2]['Dry_bulb_temperature']
是Series ,而concat期望DataFrame 无法与Dataframe连接,即concat需要两个相似的类型(以前的评论是错误的,如下面的@Philip所述。
所以我可以将room1 DataFrame与天气DataFrame结合起来。这是要走的路吗?如何避免两个“时间”系列重复?
我有很多房间(n)数据框架,并且认为可能有一种方法可以引用相同的天气数据集。
答案 0 :(得分:1)
我不确定你的联合会发生了什么。可能是您的字段名称混淆了。我在你问题的不同部分看到了'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')]
代码少,易于阅读。
答案 1 :(得分: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
在merging, join and concating section of the docs。
中查看更多内容注意:
您可以使用loc创建Series /列,避免链接:
s = weather.loc[selector2, 'Dry_bulb_temperature']
答案 2 :(得分: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
不确定这是否是达到目标的最佳方式,但现在可行。谢谢你让我走上正轨。