Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.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值_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何基于前面的列填充NaN值

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)

例如,这就是我所拥有的

    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