Python 基于其他列值处理缺少的值

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:

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