簡體   English   中英

有條件地在Pandas數據框中填充空白值

[英]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方法可以按順序ffillbfill

這也滿足了特定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.

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