Pandas/Python=通过将列Y与另一个在X中具有值的行匹配来替换列X中的NaN值的函数

2024-09-28 03:15:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一个函数来解决下面的问题。我试图通过映射数据帧来解决这个问题,但这似乎是一个更好的解决方案,我只是无法正确地理解语法

^{tb1}$

我想说“如果行[X]是np.NaN,那么取Y中的值,看看是否有匹配项,如果有,则从另一行返回X中的值,否则只取Y值,以便:

^{tb2}$

编辑:只是澄清我的数据帧更像这样,所以使用ffill/bfill似乎不起作用(除非我可以在这行中添加条件)

数据看起来更像这样

^{tb3}$

Tags: 数据函数编辑np语法nan解决方案条件
3条回答
df
            X          Y
0   Company 1   Parent 1
1   NaN         Parent 2
2   NaN         Parent 3
3   Company 2   Parent 2
4   Company 3   Parent 3
5   NaN         Parent 1

首先,您可以创建YX的映射。因此,您可以从表中删除NaN并将其转换为字典

temp = df.dropna(axis=0, how='any')
temp
            X          Y
0   Company 1   Parent 1
3   Company 2   Parent 2
4   Company 3   Parent 3

map1 = pd.Series(temp['X'].values, index=temp['Y']).to_dict()
map1
{'Parent 1': 'Company 1', 'Parent 2': 'Company 2', 'Parent 3': 'Company 3'}

然后,您可以使用Y的映射fillna。它只会影响其为NaN的值

df['X'] = df['X'].fillna(df['Y'].map(map1))
df

            X          Y
0   Company 1   Parent 1
1   Company 2   Parent 2
2   Company 3   Parent 3
3   Company 2   Parent 2
4   Company 3   Parent 3
5   Company 1   Parent 1

作为参考,我使用lambda设法找到了这个问题的解决方案

#Specify which entries in the Name column are NaN
missing_name = df.X.isnull()

#Set index of new dataframe to Borrower
df_name = df_X.set_index('Y')

#impute the Name from the new dataframe at the null positions in the old dataframe
df.loc[miss_name, 'X'] = df.loc[miss_name, 'Y'].apply(lambda x: df_name.X[x])

您可以将transformfirst一起使用:

df['X'] = df.groupby('Y')['X'].transform('first')
df

输出:

           X         Y
0  Company 1  Parent 1
1  Company 2  Parent 2
2  Company 3  Parent 3
3  Company 2  Parent 2
4  Company 3  Parent 3
5  Company 1  Parent 1

相关问题 更多 >

    热门问题