簡體   English   中英

使用基於(非唯一)列值的其他行中的值替換 DataFrame 行中的 NaN 值

[英]Replacing NaN values in a DataFrame row with values from other rows based on a (non-unique) column value

我有一個類似於以下內容的 DataFrame,其中我有一列具有非唯一值(在本例中為地址)以及其他一些包含有關它的信息的列。

df = pd.DataFrame({'address': {0:'11 Star Street', 1:'22 Milky Way', 2:'88 Dark Drive', 3:'33 Planet Place', 4:'22 Milky Way', 5:'22 Milky Way'}, 'val': {0:10, 1:'', 2:'', 3:20, 4: 20, 5:''}, 'val2': {0:20, 1:'', 2:'', 3:40, 4:10, 5:''}})

           address val val2
0   11 Star Street  10   20
1     22 Milky Way         
2    88 Dark Drive         
3  33 Planet Place  20   40
4     22 Milky Way  20   10
5     22 Milky Way          

一些地址在 DataFrame 中出現不止一次,而其中一些重復的地址缺少信息。 如果某行缺少值,但該地址出現在 DataFrame 的另一行中,我想用來自同一地址的值替換 NaN 值以獲得如下內容:

           address val val2
0   11 Star Street  10   20
1     22 Milky Way  20   10
2    88 Dark Drive         
3  33 Planet Place  20   40
4     22 Milky Way  20   10
5     22 Milky Way  20   10

使用字典之類的東西是不可行的,因為 DataFrame 包含數千個不同的地址。

編輯:可以安全地假設兩個值都缺失或兩者都存在。 換句話說,永遠不會有一行只有 val 而不是 val2,反之亦然。 但是,可以將這種可能情況考慮在內的答案會更好!

您可以通過多種方式執行此操作,最簡單的是 groupby 和 ffill / bfill 組。

import numpy as np
import pandas as pd
df = df.replace('',np.nan,regex=True).groupby('address').apply(lambda x : x.ffill().bfill())

print(df)

           address   val  val2
0   11 Star Street  10.0  20.0
1     22 Milky Way  20.0  10.0
2    88 Dark Drive   NaN   NaN
3  33 Planet Place  20.0  40.0
4     22 Milky Way  20.0  10.0
5     22 Milky Way  20.0  10.0

另一種更高效的方法是沿軸使用update

vals = df.replace('',np.nan,regex=True).groupby('address').first()

print(vals)
    
                     val  val2
    address                    
    11 Star Street   10.0  20.0
    22 Milky Way     20.0  10.0
    33 Planet Place  20.0  40.0
    88 Dark Drive     NaN   NaN

df = df.set_index('address')

df.update(vals)

                val val2
address                 
11 Star Street   10   20
22 Milky Way     20   10
88 Dark Drive           
33 Planet Place  20   40
22 Milky Way     20   10
22 Milky Way     20   10

暫無
暫無

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

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