我有一个数据框df:
df = pd.DataFrame({'City': ['Cambridge','','Boston','Washignton','','Tampa',
'Danvers','Miami','Cambridge','Miami','','Washington'], 'State': ['MA','DC','MA',
'DC','MA','FL','MA','FL','MA','FL','FL','DC']})
正如我们在上面的df中所看到的,我有两列" City"和"州"。有3个城市有'' (没有价值)。我想为城市中的缺失值分配一个值。分配必须按以下方式完成 - 存在特定状态的最大次数的城市应分配给该特定状态的缺失值。例如:第二个缺失的城市对应于州MA。现在,如果我仔细查看数据,"剑桥"是州MA发生次数最多的城市。因此,该缺失值应替换为" Cambridge"。
按照同样的趋势,第一个失踪的城市应该是华盛顿,第二个应该是剑桥,第三个应该是迈阿密。
如何使用熊猫完成此任务?
答案 0 :(得分:3)
IIUC
df.update(df.replace('', np.nan).set_index('State', append=True) \
.groupby(level='State').City \
.apply(lambda x: x.fillna(x.value_counts().idxmax())) \
.reset_index('State', drop=True))
df
参考代码
注意: 其他列A
是原始City
列,可让您更轻松地查看城市的填写位置。
df = pd.DataFrame({
'City': ['Cambridge','','Boston','Washignton','','Tampa',
'Danvers','Miami','Cambridge','Miami','','Washington'],
'State': ['MA','DC','MA','DC','MA','FL',
'MA','FL','MA','FL','FL','DC'],
'A': ['Cambridge','','Boston','Washignton','','Tampa',
'Danvers','Miami','Cambridge','Miami','','Washington']})
df.update(df.replace('', np.nan).set_index('State', append=True) \
.groupby(level='State').City \
.apply(lambda x: x.fillna(x.value_counts().idxmax())) \
.reset_index('State', drop=True))
df
答案 1 :(得分:0)
top_cities = {}
for state in np.unique(df.State):
cities = [city for city in df[df.State==state].City.values if city]
top_cities[state] = max(set(cities), key=cities.count)
new_cities = []
for city, state in df.values:
if city:
new_cities.append(city)
else:
new_cities.append(top_cities[state])
df['City'] = new_cities