【问题标题】:Python Pandas Fill Dataframe with another DataFramePython Pandas 用另一个 DataFrame 填充 DataFrame
【发布时间】:2017-08-28 00:31:41
【问题描述】:

我有一个数据框

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

我想用“x”中的数据填充“y”,这样每个工作日和每个小时都有相同的数据,但附加了一个日期戳。 我知道的唯一方法是遍历日期和填充值。有没有更快、更有效的方法来做到这一点? 我的解决方案(至少可以说相当粗糙)逐行迭代整个数据帧 y 并尝试通过查找从数据帧 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)]

【问题讨论】:

  • 您的预期结果是什么?
  • 我的预期结果是一个数据框 y,其中 c1、c2、c3 列的数据来自数据框 x..where y.wkday=x.wkday 和 y.hr=x.hr
  • 1.来自x 的确切数据是否与y 中的多个星期块重复? 2. 从x,如果超过一周,你怎么知道y 更新哪个日期时间? 3. 听起来df.update 可能会有所帮助。
  • 是的,我想更新相同的确切数据......正如你所说的重复数周。

标签: python pandas dataframe


【解决方案1】:

您的数据框 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)]

但是,遍历数据帧非常昂贵,您应该通过简单地合并 2 个帧并删除不需要的列来寻找矢量化解决方案:

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 倍。

【讨论】:

    猜你喜欢
    • 2019-04-26
    • 2022-12-22
    • 2015-02-14
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多