如何根据前几列填充NaN值

时间:2020-02-12 11:43:57

标签: 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    4
2   2    30*   8
3   3    40*   2
4   2    30    9
5   3    40    1
6   1    20*   3

填充值上的星号。

这需要使用非常大的数据帧进行扩展。

另外,如果我在左列中有一个值,而在单独的观察中,该值在右侧有多个,那么我该如何用均值填充?

2 个答案:

答案 0 :(得分:2)

您可以在groupby上使用'A',然后使用first'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)

答案 1 :(得分:0)

您可以先进行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