根据标识符覆盖列中的NaN

N08*_*N08 0 python pandas

我有一个数据框,NaN在-column中包含一些值t.t-column中的值属于某个值,id并且应该相同id:

df = pd.DataFrame({"t"  :   [4, 4, 1, 1, float('nan'), 2, 2, 2, float('nan'), 10],
                   "id":    [1, 1, 2, 2, 3, 3, 3 , 3, 4, 4]})
Run Code Online (Sandbox Code Playgroud)

因此,我想覆盖 NaNt与非NaNt用于相应的id与最终结束了

df = pd.DataFrame({"t"  :   [4, 4, 1, 1, 2, 2, 2, 2, 10, 10],
                   "id":    [1, 1, 2, 2, 3, 3, 3 , 3, 4, 4]})
Run Code Online (Sandbox Code Playgroud)

Ant*_*vBR 5

新策略...通过删除na创建地图并使用loc和mask重新分配.

import pandas as pd

df = pd.DataFrame({"t"  :   [4, 4, 1, 1, float('nan'), 2, 2, 2, float('nan'), 10],
                   "id":    [1, 1, 2, 2, 3, 3, 3 , 3, 4, 4]})

# create mask
m = pd.isna(df['t'])

# create map
#d = df[~m].set_index('id')['t'].drop_duplicates()
d = df[~m].set_index('id')['t'].to_dict()

# assign map to the slice of the dataframe containing nan
df.loc[m,'t'] = df.loc[m,'id'].map(d)

print(df)
Run Code Online (Sandbox Code Playgroud)

df返回:

   id     t
0   1   4.0
1   1   4.0
2   2   1.0
3   2   1.0
4   3   2.0
5   3   2.0
6   3   2.0
7   3   2.0
8   4  10.0
9   4  10.0
Run Code Online (Sandbox Code Playgroud)