我有一个数据框
x = pd.DataFrame(index = ['wkdy','hr'],columns=['c1','c2','c3'])
这导致数据帧中有168行数据。每天7个工作日和24小时。 我有另一个数据框
dates = pd.date_range('20090101',periods = 10000, freq = 'H')
y = DataFrame(np.random.randn(10000, 3), index = dates, columns = ['c1','c2','c3'])
y['hr'] = y.index.hour
y['wkdy'] = y.index.weekday
我想填写' y'来自' x'的数据,以便每个工作日和小时都有相同的数据但附加了日期戳。 我知道的唯一方法是遍历日期并填充值。有没有更快,更有效的方法来做到这一点? 我的解决方案(相当粗略地说,至少)逐行遍历整个数据帧,并尝试通过查找从数据帧x填充。
for r in range(0,len(y)):
h = int(y.iloc[r]['hr'])
w = int(y.iloc[r]['wkdy'])
y.iloc[r] = x.loc[(w,h)]
答案 0 :(得分:0)
您的数据框x没有168行,但是看起来像
c1 c2 c3
wkdy NaN NaN NaN
hr NaN NaN NaN
,您无法使用x.loc[(w,h)]
中的元组对其进行索引。您可能想到的是类似
x = pd.DataFrame(
index=pd.MultiIndex.from_product(
[range(7), range(24)], names=['wkdy','hr']),
columns=['c1','c2','c3'],
data=np.arange(3 * 168).reshape(3, 168).T)
x
c1 c2 c3
wkdy hr
0 0 0 168 336
1 1 169 337
... ... ... ... ...
6 22 166 334 502
23 167 335 503
168 rows × 3 columns
现在,尽管 pythonic 表示形式如下:
for idx, row in y.iterrows():
y.loc[idx, :3] = x.loc[(row.wkdy, row.hr)]
但是,遍历数据帧非常昂贵,您应该通过简单地合并两个帧并删除不需要的列来寻找矢量化解决方案:
y = (x.merge(y.reset_index(), on=['wkdy', 'hr'])
.set_index('index')
.sort_index()
.iloc[:,:-3])
y
wkdy hr c1_x c2_x c3_x
index
2009-01-01 00:00:00 3 0 72 240 408
2009-01-01 01:00:00 3 1 73 241 409
... ... ... ... ... ...
2010-02-21 14:00:00 6 14 158 326 494
2010-02-21 15:00:00 6 15 159 327 495
10000 rows × 5 columns
现在y是具有列c1_x,c2_x,c3_x的数据帧,其中包含来自数据帧x的数据,其中y.wkdy == x.wkdy和y.hr == x.hr。在这里合并比循环快1000倍。