根据异常重复模式填充空值

问题描述 投票:0回答:1

我有一个 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 华盛顿特区 华盛顿特区 公寓

规则: 如果某个城市的城市列中有空值,则适用以下规则:

  1. 正确的城市 ID 将始终出现在“城市”列中该城市的第一个匹配项中
  2. 正确的地址类型将始终出现在“城市”列中该城市的第二次出现中
  3. “城市”的空值将始终出现在该城市的第三个条目中
  4. 对于空值的城市,总会有 5 个条目

如果一个城市没有空值,它将不会总是有 5 个条目

具有空值的城市组在数据集中随机出现,因此需要有一个规则来阻止过度填充到另一个组中

只要填充了 City_ID 和 Address_type,我并不关心回填正确的日期、州和城市字段。

谢谢

python pandas dataframe group-by data-cleaning
1个回答
0
投票

这应该是窍门。

# 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
© www.soinside.com 2019 - 2024. All rights reserved.