我有一个 pandas df,需要通过在 city_id 和 address_type 字段中填充空值来清理:
城市_ID | 日期 | 状态 | 城市 | 地址_类型 |
---|---|---|---|---|
1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | 房子 |
1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | 房子 |
1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | 房子 |
1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | 房子 |
1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | 房子 |
空 | 10/1/24 | 加利福尼亚州 | 1002 | 空 |
空 | 10/1/24 | 加利福尼亚州 | 房子 | 空 |
空 | 空 | 空 | 空 | 空 |
空 | 10/1/24 | 加利福尼亚州 | 圣地亚哥 | 空 |
空 | 10/1/24 | 加利福尼亚州 | 圣地亚哥 | 空 |
空 | 10/1/24 | 纽约 | 1003 | 空 |
空 | 10/1/24 | 纽约 | 公寓 | 空 |
空 | 空 | 空 | 空 | 空 |
空 | 10/1/24 | 纽约 | 皇后区 | 空 |
空 | 10/1/24 | 纽约 | 皇后区 | 空 |
1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | 公寓 |
1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | 公寓 |
1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | 公寓 |
1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | 公寓 |
1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | 公寓 |
这是所需的输出:
城市_ID | 日期 | 状态 | 城市 | 地址_类型 |
---|---|---|---|---|
1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | 房子 |
1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | 房子 |
1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | 房子 |
1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | 房子 |
1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | 房子 |
1002 | 10/1/24 | 加利福尼亚州 | 圣地亚哥 | 房子 |
1002 | 10/1/24 | 加利福尼亚州 | 圣地亚哥 | 房子 |
1002 | 10/1/24 | 加利福尼亚州 | 圣地亚哥 | 房子 |
1002 | 10/1/24 | 加利福尼亚州 | 圣地亚哥 | 房子 |
1002 | 10/1/24 | 加利福尼亚州 | 圣地亚哥 | 房子 |
1003 | 10/1/24 | 纽约 | 皇后区 | 公寓 |
1003 | 10/1/24 | 纽约 | 皇后区 | 公寓 |
1003 | 10/1/24 | 纽约 | 皇后区 | 公寓 |
1003 | 10/1/24 | 纽约 | 皇后区 | 公寓 |
1003 | 10/1/24 | 纽约 | 皇后区 | 公寓 |
1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | 公寓 |
1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | 公寓 |
1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | 公寓 |
1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | 公寓 |
1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | 公寓 |
规则: 如果某个城市的城市列中有空值,则适用以下规则:
如果一个城市没有空值,它将不会总是有 5 个条目
具有空值的城市组在数据集中随机出现,因此需要有一个规则来阻止过度填充到另一个组中
只要填充了 City_ID 和 Address_type,我并不关心回填正确的日期、州和城市字段。
谢谢
这应该是窍门。
# Extracts the missing ID from the city column
ids = df['City'].str.extract(r'(\d+)')[0].astype('float')
# Checks if Any "Adress Type" are in the City Column
type_c = df['City'].isin(df['Address_type'])
# Fills the missing IDs
df['City_ID'] = df['City_ID'].fillna(ids)
# Removes the ids and the adress type from the city column
df['City'] = df['City'].mask(ids.notna() | type_c)
# fills the missing adress type
df['Address_type'] = np.where(type_c, df['City'], df['Address_type'])
# Create groups based on the non na values and fill the missing values.
g = df['City_ID'].notna()
final_df = (df.groupby(g.cumsum()).ffill().bfill()
.astype({'City_ID': 'int'})
最终结果:
City_ID Date State City Address_type
1001 10/1/24 Texas Houston House
1001 10/1/24 Texas Houston House
1001 10/1/24 Texas Houston House
1001 10/1/24 Texas Houston House
1001 10/1/24 Texas Houston House
1002 10/1/24 California San Diego Apartment
1002 10/1/24 California San Diego Apartment
1002 10/1/24 California San Diego Apartment
1002 10/1/24 California San Diego Apartment
1002 10/1/24 California San Diego Apartment
1003 10/1/24 New York Queens Apartment
1003 10/1/24 New York Queens Apartment
1003 10/1/24 New York Queens Apartment
1003 10/1/24 New York Queens Apartment
1003 10/1/24 New York Queens Apartment
1003 10/1/24 New York Queens Apartment
1004 10/1/24 Washington DC Washington DC Apartment
1004 10/1/24 Washington DC Washington DC Apartment
1004 10/1/24 Washington DC Washington DC Apartment
1004 10/1/24 Washington DC Washington DC Apartment
1004 10/1/24 Washington DC Washington DC Apartment