簡體   English   中英

Pandas / Python = Function 通過將 Y 列與在 X 中具有值的另一行匹配來替換 X 列中的 NaN 值

[英]Pandas / Python = Function that replaces NaN value in column X by matching Column Y with another row that has a value in X

我正在嘗試編寫解決以下問題的 function。 我嘗試通過映射數據框來解決它,但這似乎是一個更好的解決方案,我只是無法正確使用語法。

X 是的
公司 1 家長 1
家長 1
家長 1

我想說“如果 row[X] 是 np.NaN,那么取 Y 中的值,看看是否有匹配項,如果匹配則從另一行返回 X 中的值,否則只需取 Y 值,這樣:

X 是的
公司 1 家長 1
公司 1 家長 1
公司 1 家長 1

編輯:只是澄清我的 dataframe 更像這樣,所以使用 ffill/bfill 似乎不起作用(除非我可以在這一行中添加條件)。

數據看起來更像這樣

X 是的
公司 1 家長 1
家長 2
家長 3
公司 2 家長 2
公司 3 家長 3
家長 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])
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的 map 。 因此,您可以從表中刪除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'}

然后,您可以使用Yfillna填充。 它只會影響它是 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

您可以將transformfirst一起使用:

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

Output:

           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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM