繁体   English   中英

Pandas 用基于另一列的第一个非 nan 值替换 nan

[英]Pandas replace nan with first non-nan value based on another column

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

import pandas as pd

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

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

    A   B   C
0  p1      v1
1  p2      ba
2  p3   9  fg
3  p1   1  fg
4  p2  45  af
5  p3   1  fg
6  p1   1  hf

B 列有重复项,其中最新的值应该是非 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

我确定有更好的方法来做到这一点,但我不确定如何。 有人能指出更好的方法吗?

谢谢!

首先将空字符串替换为缺失值,然后将GroupBy.transformGroupBy.last用于每个组的最后一个非缺失值:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM