pandas 如果上下值相同,则填充连续的缺失单元格

vhipe2zx  于 2023-04-04  发布在  其他
关注(0)|答案(2)|浏览(131)

我在一个pandas dataframe中有这个列:

df = pd.DataFrame({'City': ['Barcelona', 'Barcelona', False, False, False, 'Barcelona', 'Paris', False, 'London', False, 'London']})

         City
0   Barcelona
1   Barcelona
2       False
3       False
4       False
5   Barcelona
6       Paris
7       False
8      London
9       False
10     London

我想要这个结果(注意巴黎和伦敦之间的False):

out = pd.DataFrame({'City': ['Barcelona', 'Barcelona', 'Barcelona', 'Barcelona', 'Barcelona', 'Barcelona', 'Paris', False, 'London', 'London', 'London']})

         City
0   Barcelona
1   Barcelona
2   Barcelona
3   Barcelona
4   Barcelona
5   Barcelona
6       Paris
7       False
8      London
9      London
10     London

包含Barcelona的两个单元格之间的False值应该都更改为Barcelona。然而,巴黎和伦敦之间的单元格应该保持为False,因为我们不知道它对应的是哪个城市。最后,对于最后一个缺少的伦敦,它也应该更改并包含这个城市。
我尝试只考虑单元格的上下部分来更改False值,当然,只有最后一个缺失值更改为伦敦。
然而,我认为可以有一个解决方案,即创建一个临时列,该列传播连续值序列之前提到的最后一个城市的名称,并且仅在下一个有效城市与正在传播的城市相同时才将数据传输到有效列。如果不是,则应拒绝传播,并保留False值。
这只是一个想法,我不知道是否可以这样做,我也不知道如何建立它。我如何解决我的问题?有没有直接的方法?

cngwdvgl

cngwdvgl1#

您可以将False替换为NaN,执行双重ffill/bfill,并仅保留布尔索引的相同填充:

s1 = df['City'].replace({False: np.nan})
s2 = s1.ffill()

df.loc[s2.eq(s1.bfill()), 'City'] = s2

输出:

City
0   Barcelona
1   Barcelona
2   Barcelona
3   Barcelona
4   Barcelona
5   Barcelona
6       Paris
7       False
8      London
9      London
10     London

中间体:

City      ffill      bfill  ffill==bfill
0   Barcelona  Barcelona  Barcelona          True
1   Barcelona  Barcelona  Barcelona          True
2   Barcelona  Barcelona  Barcelona          True
3   Barcelona  Barcelona  Barcelona          True
4   Barcelona  Barcelona  Barcelona          True
5   Barcelona  Barcelona  Barcelona          True
6       Paris      Paris      Paris          True
7       False      Paris     London         False
8      London     London     London          True
9      London     London     London          True
10     London     London     London          True
nqwrtyyt

nqwrtyyt2#

import pandas as pd
import numpy as np

df = pd.DataFrame({'City': ['Barcelona', 'Barcelona', False, False, False, 'Barcelona', 'Paris', False, 'London', False, 'London']})

# Define a special ffill mask by excluding 'Paris'
m = (df['City'].replace(False, np.nan).ffill()).ne('Paris')
# Update df values except Paris locations
df[m] = df[m].replace(False, np.nan).ffill()

print(df)
City
0   Barcelona
1   Barcelona
2   Barcelona
3   Barcelona
4   Barcelona
5   Barcelona
6       Paris
7       False
8      London
9      London
10     London

相关问题