Python 如何基于前面的列填充NaN值
我有一个初始列,没有丢失的数据(A),但有重复的值。如何用缺少的数据填充下一列(B),使其填充,并且左侧的列始终具有右侧的相同值?我还希望任何其他列保持不变(C) 例如,这就是我所拥有的Python 如何基于前面的列填充NaN值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个初始列,没有丢失的数据(A),但有重复的值。如何用缺少的数据填充下一列(B),使其填充,并且左侧的列始终具有右侧的相同值?我还希望任何其他列保持不变(C) 例如,这就是我所拥有的 A B C 1 1 20 4 2 2 NaN 8 3 3 NaN 2 4 2 30 9 5 3 40 1 6 1 NaN 3 这就是我想要的 A B C 1 1 20
A B C
1 1 20 4
2 2 NaN 8
3 3 NaN 2
4 2 30 9
5 3 40 1
6 1 NaN 3
这就是我想要的
A B C
1 1 20 4
2 2 30* 8
3 3 40* 2
4 2 30 9
5 3 40 1
6 1 20* 3
填充值上的星号
这需要使用非常大的数据帧进行扩展
此外,如果我在左列有一个值,而在单独的观察结果的右侧有多个值,我将如何填充平均值?您可以在
'a'
上使用groupby
,并使用first
在'B'
中查找第一个对应的值(它不会选择NaN
)
哪些产出:
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
如果在'B'
中有许多NaN
值,您可能希望在使用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)
您可以先对_值进行排序,然后根据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
答案非常复杂。假设您有大量数据,那么插补取决于数据的类型。虽然,这可以按语法进行,但在此之前,您需要对数据进行预分析,并检查各种类型的缺失。不需要所有数据。您需要:
df['B']=df['B'].fillna(df.groupby('A')['B'].transform('mean'))
前面有人问过类似的问题,我在这里解释了如何用组的平均值填充缺失的数字:
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