【问题标题】:Backfill values in Pandas series when value matches another column当值与另一列匹配时,在 Pandas 系列中回填值
【发布时间】:2017-05-08 13:38:59
【问题描述】:

我有一个这样的数据框:

import numpy as np

raw_data = {'surface': [np.nan, np.nan, 'round', 'square'],
            'city': ['San Francisco', 'Miami', 'San Francisco', 'Miami']}

df = pd.DataFrame(raw_data, columns = ['surface', 'city'])

看起来像这样:

        surface city
   0    NaN     San Francisco
   1    NaN     Miami
   2    round   San Francisco
   3    square  Miami

我需要旧金山行的最早实例用“圆形”填充,而较早的迈阿密行用“方形”填充。使用 .fillna(method='bfill') 不会考虑其他列值,而只是用 round 填充所有前面的行。

结果是:

        surface city
   0    round   San Francisco
   1    square  Miami
   2    round   San Francisco
   3    square  Miami

【问题讨论】:

  • 你想用同一个城市的第一个实数值填充 NaN 吗?

标签: python pandas


【解决方案1】:

你可以使用groupby.bfill;按 city 列对数据框进行分组,然后使用 bfill:

df.groupby('city').bfill()

#  surface           city
#0  round   San Francisco
#1  square          Miami
#2  round   San Francisco
#3  square          Miami

【讨论】:

  • 如果我们假设 pandas groupby 是 stable,这个解决方案将对每个城市的数据框进行 回填,这可能是。
【解决方案2】:

[根据PSidom的精彩回答修改]

使用groupby() 确实是关键点,但更不用说bfill() 的作用可能会令人困惑,因为它并没有按照您的实际想法做。

让我们快速浏览一下文档here。 而不是像 OP 想要的那样回填数据,它实际上只是在下一列中用非缺失数据填充缺失的数据。 在这种情况下,它与groupby() 配合得很好,而您还需要使用groupby('*your group*').ffill() 进行前向填充,以防您拥有的数据更复杂。

为了进一步说明,让我们像这样修改您的数据:

import numpy as np
import pandas as pd

raw_data = {'surface': [np.nan, np.nan, 'round', 'square', np.nan, np.nan, np.nan, np.nan],
            'city': ['San Francisco', 'Miami', 'San Francisco', 'Miami', 'Miami', 'Miami', 'San Francisco', 'Miami']}
df = pd.DataFrame(raw_data, columns = ['surface', 'city'])
df

#   surface city
#0  NaN     San Francisco
#1  NaN     Miami
#2  round   San Francisco
#3  square  Miami
#4  NaN     Miami
#5  NaN     Miami
#6  NaN     San Francisco
#7  NaN     Miami

只有df.groupby('city').bfill(),你会得到:

df2 = df.groupby('city').bfill()
df2

#   surface city
#0  round   San Francisco
#1  square  Miami
#2  round   San Francisco
#3  square  Miami
#4  NaN     Miami
#5  NaN     Miami
#6  NaN     San Francisco
#7  NaN     Miami

看看那里发生了什么? bfill() 在第 0 行和第 1 行完成了这项工作,但第 4 ~ 7 行保持不变。您应该同时使用bfill()ffill()。也许是这样的:

df3 =  df2.groupby('city').ffill()
df3

#   surface city
#0  round   San Francisco
#1  square  Miami
#2  round   San Francisco
#3  square  Miami
#4  square  Miami
#5  square  Miami
#6  round   San Francisco
#7  square  Miami

请注意,您不应使用 df.groupby('city').bfill().ffill() 之类的内容。它会在那里填错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2016-11-22
    • 2022-01-15
    • 2013-03-28
    • 2020-11-26
    相关资源
    最近更新 更多