Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据另一列,使用第一个非nan值替换nan_Python_Pandas_Dataframe_For Loop - Fatal编程技术网

Python 根据另一列,使用第一个非nan值替换nan

Python 根据另一列,使用第一个非nan值替换nan,python,pandas,dataframe,for-loop,Python,Pandas,Dataframe,For Loop,我有一个如下形式的数据框:(比这些列多得多-为了简洁起见删除) B列有重复项,其中最新值应为非NA(但可能不是NA) 我想用最新的非NA值替换col B值。大概是这样的: unique_people = df['A'].unique() for person in unique_people: sub_df = df[df['A'] == person] val = sub_df['B'].tail(1).values df['A'][df['A'] == person]

我有一个如下形式的数据框:(比这些列多得多-为了简洁起见删除)

B列有重复项,其中最新值应为非NA(但可能不是NA)

我想用最新的非NA值替换col B值。大概是这样的:

unique_people = df['A'].unique()
for person in unique_people:
    sub_df = df[df['A'] == person]
    val = sub_df['B'].tail(1).values
    df['A'][df['A'] == person] = val  # this also doesnt work because its not inplace
我肯定有更好的办法,但我不知道怎么做。有人能指出更好的方法吗


谢谢

首先将空字符串替换为缺少的值,然后对每组最后一个非缺少的值使用:

headers = ['A','B','C']
data = [['p1','','v1'],
        ['p2','','ba'],
        ['p3',9,'fg'],
        ['p1',1,'fg'],
        ['p2',45,'af'],
        ['p3',1,'fg'],
        ['p1','','hf']
        ]

df = pd.DataFrame(data,columns=headers)

df['B'] = df['B'].replace('', np.nan)

df['B'] = df.groupby('A')['B'].transform('last')
print (df)
    A     B   C
0  p1   1.0  v1
1  p2  45.0  ba
2  p3   1.0  fg
3  p1   1.0  fg
4  p2  45.0  af
5  p3   1.0  fg
6  p1   1.0  hf
headers = ['A','B','C']
data = [['p1','','v1'],
        ['p2','','ba'],
        ['p3',9,'fg'],
        ['p1',1,'fg'],
        ['p2',45,'af'],
        ['p3',1,'fg'],
        ['p1','','hf']
        ]

df = pd.DataFrame(data,columns=headers)

df['B'] = df['B'].replace('', np.nan)

df['B'] = df.groupby('A')['B'].transform('last')
print (df)
    A     B   C
0  p1   1.0  v1
1  p2  45.0  ba
2  p3   1.0  fg
3  p1   1.0  fg
4  p2  45.0  af
5  p3   1.0  fg
6  p1   1.0  hf