簡體   English   中英

當值與另一列匹配時,Pandas 系列中的回填值

[英]Backfill values in Pandas series when value matches another column

我有一個像這樣的數據幀:

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') 不會考慮其他列值,只會用圓形填充所有較早的行。

結果將是:

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

您可以使用groupby.bfill 城市列對數據框進行分組,然后使用bfill

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

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

[根據PSidom的令人欽佩的回答修改]

使用groupby()確實是關鍵點,但更不用說bfill()作用可能會令人困惑,因為它並沒有按照您實際認為的那樣做。

讓我們快速瀏覽一下這里的文檔。 而不是像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() 它會在那里填補一些錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM