[英]Conditionally filling blank values in Pandas dataframes
我有一個數據場,如下所示(有更多列被刪除):
memberID shipping_country
264991
264991 Canada
100 USA
5000
5000 UK
我正在嘗試用每個用戶的運送國家/地區的現有值填充空白單元格:
memberID shipping_country
264991 Canada
264991 Canada
100 USA
5000 UK
5000 UK
但是,我不確定在大規模數據集上執行此操作的最有效方法是什么。 也許使用矢量分組方式?
您可以使用GroupBy
+ ffill
/ bfill
:
def filler(x):
return x.ffill().bfill()
res = df.groupby('memberID')['shipping_country'].apply(filler)
自定義功能是必需的,因為沒有組合的Pandas方法可以按順序ffill
和bfill
。
這也滿足了特定memberID
所有值均為NaN
的情況; 在這種情況下,它們將保留為NaN
。
對於以下示例數據幀(我在shipping_country
列中添加了一個僅包含''
的memberID
組):
memberID shipping_country
0 264991
1 264991 Canada
2 100 USA
3 5000
4 5000 UK
5 54
這應該對您memberID
,並且還具有以下行為:如果memberID
組在shipping_country
僅具有空字符串值( ''
),則這些值將保留在輸出df
:
df['shipping_country'] = df.replace('',np.nan).groupby('memberID')['shipping_country'].transform('first').fillna('')
產量:
memberID shipping_country
0 264991 Canada
1 264991 Canada
2 100 USA
3 5000 UK
4 5000 UK
5 54
如果要在輸出df
中將空字符串''
保留為NaN
,則只需刪除fillna('')
,則保留:
df['shipping_country'] = df.replace('',np.nan).groupby('memberID')['shipping_country'].transform('first')
您可以使用鏈接的groupby
,一個使用正向填充,另一個使用回填:
# replace blank values with `NaN` first:
df['shipping_country'].replace('',pd.np.nan,inplace=True)
df.iloc[::-1].groupby('memberID').ffill().groupby('memberID').bfill()
memberID shipping_country
0 264991 Canada
1 264991 Canada
2 100 USA
3 5000 UK
4 5000 UK
此方法還將允許由所有NaN
組成的組保留為NaN
:
>>> df
memberID shipping_country
0 264991
1 264991 Canada
2 100 USA
3 5000
4 5000 UK
5 1
6 1
df['shipping_country'].replace('',pd.np.nan,inplace=True)
df.iloc[::-1].groupby('memberID').ffill().groupby('memberID').bfill()
memberID shipping_country
0 264991 Canada
1 264991 Canada
2 100 USA
3 5000 UK
4 5000 UK
5 1 NaN
6 1 NaN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.