【问题标题】:Populate a dataframe based on a aggregated dataframe基于聚合数据框填充数据框
【发布时间】:2019-07-02 16:32:07
【问题描述】:

我有一个这样的数据框,它是在一些聚合和条件之后生成的,

X      P       D1           D2
1      A    2016-06-02   2016-07-26
2      A    2016-10-04   2016-12-01
3      A    2016-12-13   2017-03-11
1      B    2017-03-04   2018-01-11

从这个数据框中,我必须填充另一个具有 n 列的数据框,其中每列在 [201606, 201607,......, 201801] 的范围内为一个月,这是之前制作的。即我已经有一个包含上述列的数据框。我想填充那个数据框。

我想为聚合数据框中的每条记录创建一行,其中 X、P 的组合在整个聚合数据框中是唯一的。

对于第一条记录,我想用 1 填充 201606 到 201607 列,即从 D1D2(包括两者)。所有其他列应该是 0

对于第二行,我想用 10 填充 201610 到 201612 列,以用于聚合数据框中的每一行。

如何使用 pandas 更快、更有效地做到这一点?我不喜欢遍历数据框,因为我的数据会很大。

如果填充现有数据框并不理想,生成我上面提到的数据框也可以达到我的目的。

【问题讨论】:

  • 您是要创建这个数据框还是填充现有的数据框? “从这个数据帧中,我必须填充 另一个数据帧,它有 n 个列,如果每个列在 min(D1) 到 max(D2) 的范围内持续一个月,例如 [201606, 201607 ,......, 201801]"
  • 其实我想填充。我已经有了一个包含[201606, ....., 201801] 之类的列的数据框。我已经编辑了问题以显示这一点。如果填充是一个问题,我也可以从聚合数据框创建。

标签: python pandas dataframe


【解决方案1】:

我无法想象如何不迭代任何东西。但是可以迭代初始数据帧的行或结果数据帧的列:

首先构建所有列都为 0 的结果数据框

resul = pd.DataFrame(data = 0, columns=pd.period_range(df.D1.min(), df.D2.max(), freq='M'),
                     index = df.index)
  1. 迭代初始数据帧的行:

    for ix, row in df.iterrows():
        resul.loc[ix, pd.period_range(row.D1, row.D2, freq='M')] = 1
    
  2. 迭代结果数据框的列

    for c in resul.columns:
        resul[c] = np.where((c.end_time>=df.D1)&(c.start_time <= df.D2), 1, 0)
    

在这两种情况下,您的示例数据都会按预期提供:

   2016-06  2016-07  2016-08  2016-09  2016-10  2016-11  2016-12  2017-01  2017-02  2017-03  2017-04  2017-05  2017-06  2017-07  2017-08  2017-09  2017-10  2017-11  2017-12  2018-01
0        1        1        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0
1        0        0        0        0        1        1        1        0        0        0        0        0        0        0        0        0        0        0        0        0
2        0        0        0        0        0        0        1        1        1        1        0        0        0        0        0        0        0        0        0        0
3        0        0        0        0        0        0        0        0        0        1        1        1        1        1        1        1        1        1        1        1

两种方法之间的选择将是更短的迭代:如果初始数据帧的行数少于结果数据帧的列数,则选择方法 1,否则选择方法 2

【讨论】:

  • 您的解决方案看起来很酷。我已经实现了类似的东西。让我检查一下我的时间限制并回复你。
猜你喜欢
  • 2021-04-25
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 2012-09-11
  • 2019-06-11
相关资源
最近更新 更多