![](/img/trans.png)
[英]Backfill column values using real value divided by number of preceding NA values in 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
使用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.