[英]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
首先,您可以創建Y
到X
的 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'}
然后,您可以使用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
您可以將transform
與first
一起使用:
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.