当值与另一列匹配时,Pandas系列中的回填值

时间:2017-05-08 03:04:32

标签: python pandas

我有一个像这样的DataFrame:

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

我需要在旧金山排的最早一个例子中填充“#round”,以及早先迈阿密的一排用“#square”填充。使用.fillna(method =' bfill')不会考虑其他列值,只需用圆形填充所有早期行。

结果将是:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

[根据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()这样的东西。它会在那里填补一些错误。