Python 基于其他列值处理缺少的值
我有一个数据帧df:Python 基于其他列值处理缺少的值,python,pandas,Python,Pandas,我有一个数据帧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中所看到的,我有两列“城市”和“国家”。有
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中所看到的,我有两列“城市”和“国家”。有3个城市具有“”(无值)。我想为城市中缺少的值指定一个值。必须按照以下方式进行赋值-对于特定状态,存在最大次数的城市应分配给该特定状态的缺失值。例如:第二个缺失的城市对应于州MA。现在如果我仔细看一下数据,“剑桥”是该州发生次数最多的城市。因此,缺失的值应替换为“Cambridge”
按照同样的趋势,第一个失踪的城市应该是华盛顿,第二个应该是剑桥,第三个应该是迈阿密
我将如何使用熊猫完成这项任务 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
您提供的代码可以工作,并为我显示相同的输出。但是当我打印df的所有列时,没有在那里进行更改。可能有什么问题?您需要将我所做的分配给
df
。我会更新我的帖子。好的,那部分很有效。但是我的df还有其他的专栏。如果我运行上述代码段,它将用略高于2列的内容替换我的整个df。我希望其他专栏都是这样same@user6461192更新了帖子以避免与其他栏目混淆。现在它保留了其他栏目,但没有对“城市”栏目进行必要的更改。这些值仍然是NaN。在python 3.5和pandas版本0.19.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