为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据以前的列填充 NaN 值

如何根据以前的列填充 NaN 值

千巷猫影 2022-07-26 15:56:04
我有一个没有缺失数据 (A) 但具有重复值的初始列。如何用缺失的数据填充下一列 (B) 以便填充并且左侧的列在右侧始终具有相同的值?我还希望任何其他列保持不变 (C)例如,这就是我所拥有的    A    B     C1   1    20    42   2    NaN   83   3    NaN   24   2    30    95   3    40    16   1    NaN   3这就是我想要的    A    B     C1   1    20    42   2    30*   83   3    40*   24   2    30    95   3    40    16   1    20*   3填充值上的星号。这需要使用非常大的数据框进行扩展。此外,如果我在左列有一个值,在单独的观察中右侧有多个值,我将如何填充平均值?
查看完整描述

2 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

您可以使用groupbyon'A'和 usefirst来查找第一个对应的值'B'(它不会选择NaN)。


import pandas as pd


df = pd.DataFrame({'A':[1,2,3,2,3,1], 

                   'B':[20, None, None, 30, 40, None], 

                   'C': [4,8,2,9,1,3]})


# find first 'B' value for each 'A'

lookup = df[['A', 'B']].groupby('A').first()['B']


# only use rows where 'B' is NaN

nan_mask = df['B'].isnull()


# replace NaN values in 'B' with lookup values

df['B'].loc[nan_mask] = df.loc[nan_mask].apply(lambda x: lookup[x['A']], axis=1)


print(df)

哪个输出:


   A     B  C

0  1  20.0  4

1  2  30.0  8

2  3  40.0  2

3  2  30.0  9

4  3  40.0  1

5  1  20.0  3

如果有很多NaN值,'B'您可能希望在使用之前排除它们groupby。


import pandas as pd


df = pd.DataFrame({'A':[1,2,3,2,3,1], 

                   'B':[20, None, None, 30, 40, None], 

                   'C': [4,8,2,9,1,3]})


# Only use rows where 'B' is NaN

nan_mask = df['B'].isnull()


# Find first 'B' value for each 'A'

lookup = df[~nan_mask][['A', 'B']].groupby('A').first()['B']


df['B'].loc[nan_mask] = df.loc[nan_mask].apply(lambda x: lookup[x['A']], axis=1)


print(df)


查看完整回答
反对 回复 2022-07-26
?
大话西游666

TA贡献1817条经验 获得超14个赞

您可以先执行 sort_values,然后根据 A 列向前填充 B 列。实现这一点的方法是:


import pandas as pd

import numpy as np


x = {'A':[1,2,3,2,3,1],

     'B':[20,np.nan,np.nan,30,40,np.nan],

     'C':[4,8,2,9,1,3]}


df = pd.DataFrame(x)


#sort_values first, then forward fill based on column B

#this will get the right values for you while maintaing

#the original order of the dataframe

df['B'] = df.sort_values(by=['A','B'])['B'].ffill()

print (df)

输出将是:


原始数据:


   A     B  C

0  1  20.0  4

1  2   NaN  8

2  3   NaN  2

3  2  30.0  9

4  3  40.0  1

5  1   NaN  3

更新数据:


   A     B  C

0  1  20.0  4

1  2  30.0  8

2  3  40.0  2

3  2  30.0  9

4  3  40.0  1

5  1  20.0  3


查看完整回答
反对 回复 2022-07-26
  • 2 回答
  • 0 关注
  • 48 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信