为了账号安全,请及时绑定邮箱和手机立即绑定

python - Pandas:多列的分组填充

python - Pandas:多列的分组填充

呼唤远方 2022-01-05 10:32:09
我有以下 DataFrame 有一些缺失值。我想用ffill()两个来填补缺失值var1,并var2通过分组date和building。我可以一次为一个变量执行此操作,但是当我尝试为两个变量执行此操作时,它会崩溃。我怎样才能同时对两个变量执行此操作,同时也不修改但保留var3或var4?df = pd.DataFrame({    'date': ['2019-01-01','2019-01-01','2019-01-01','2019-01-01','2019-02-01','2019-02-01','2019-02-01','2019-02-01'],    'building': ['a', 'a', 'b', 'b', 'a', 'a', 'b', 'b'],    'var1': [1.5, np.nan, 2.1, 2.2, 1.2, 1.3, 2.4, np.nan],    'var2': [100, 110, 105, np.nan, 102, np.nan, 103, 107],    'var3': [10, 11, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],    'var4': [1, 2, 3, 4, 5, 6, 7, 8]})df      date  building  var1    var2    var3    var40   2019-01-01  a   1.5    100.0    10.0    11   2019-01-01  a   NaN    110.0    11.0    22   2019-01-01  b   2.1    105.0    NaN     33   2019-01-01  b   2.2    NaN      NaN     44   2019-02-01  a   1.2    102.0    NaN     55   2019-02-01  a   1.3    NaN      NaN     66   2019-02-01  b   2.4    103.0    NaN     77   2019-02-01  b   NaN    107.0    NaN     8# This worksdf['var1'] = df.groupby(['date', 'building'])['var1'].ffill()df['var2'] = df.groupby(['date', 'building'])['var2'].ffill()df        date  building  var1    var2    var3    var40   2019-01-01  a        1.5    100.0   10.0    11   2019-01-01  a        1.5    110.0   11.0    22   2019-01-01  b        2.1    105.0   NaN     33   2019-01-01  b        2.2    105.0   NaN     44   2019-02-01  a        1.2    102.0   NaN     55   2019-02-01  a        1.3    102.0   NaN     66   2019-02-01  b        2.4    103.0   NaN     77   2019-02-01  b        2.4    107.0   NaN     8# This doesn't workdf[['var1', 'var2']] = df.groupby(['date', 'building'])[['var1', 'var2']].ffill()ValueError: Columns must be same length as key
查看完整描述

3 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

我认为你需要fillna在你的groupby.


df[["var1", "var2"]] = df[["var1", "var2"]].fillna(df.groupby(['date', 'building'])[["var1", "var2"]].ffill())


    date        building    var1    var2    var3    var4

0   2019-01-01  a           1.5     100.0   10.0    1

1   2019-01-01  a           1.5     110.0   11.0    2

2   2019-01-01  b           2.1     105.0   NaN     3

3   2019-01-01  b           2.2     105.0   NaN     4

4   2019-02-01  a           1.2     102.0   NaN     5

5   2019-02-01  a           1.3     102.0   NaN     6

6   2019-02-01  b           2.4     103.0   NaN     7

7   2019-02-01  b           2.4     107.0   NaN     8


查看完整回答
反对 回复 2022-01-05
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

反复执行:


gb = df.groupby(['date', 'building'])

for g in ["var1", "var2"]:

    df[g] = gb[g].ffill()


         date building  var1   var2  var3  var4

0  2019-01-01        a   1.5  100.0  10.0     1

1  2019-01-01        a   1.5  110.0  11.0     2

2  2019-01-01        b   2.1  105.0   NaN     3

3  2019-01-01        b   2.2  105.0   NaN     4

4  2019-02-01        a   1.2  102.0   NaN     5

5  2019-02-01        a   1.3  102.0   NaN     6

6  2019-02-01        b   2.4  103.0   NaN     7

7  2019-02-01        b   2.4  107.0   NaN     8


查看完整回答
反对 回复 2022-01-05
?
慕的地10843

TA贡献1785条经验 获得超8个赞

@Gaurav Bansal 在数据框中拟合 group by 时,您只是缺少几列。

df[['date', 'building','var1', 'var2']] = df.groupby(['date', 'building'])[['var1', 'var2']].ffill()

Group by 将返回四列数据框,即“日期”、“建筑”、“var1”和“var2”,或者您可以只提供一个数据框来存储操作的数据框。

因此,您需要将其存储到一个四列 df 中,以便与返回的键值完美匹配。


查看完整回答
反对 回复 2022-01-05
  • 3 回答
  • 0 关注
  • 582 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号