Python 根据其他行中其他列的匹配值更新列的空填充行
假设我有一个数据帧,如下所示:Python 根据其他行中其他列的匹配值更新列的空填充行,python,python-3.x,pandas,Python,Python 3.x,Pandas,假设我有一个数据帧,如下所示: df1= 名称街道城市坐标 0 A0 B0 C0 1,1 1 A1 B0 C0 NaN 2 A2 B0 C0 NaN 3 A3 B2 C2南 4 A4 B2 C2 2,3 5 A5 B3 C3 NaN 6 A6 B3 C3 NaN 我希望结果是 df1= 名称街道城市坐标 0 A0 B0 C0 1,1 1 A1 B0 C0 1,1 2 A2 B0 C0 1,1 3 A3 B2 C2 2,3 4 A4 B2 C2 2,3 5 A5 B3 C3 NaN 6 A6 B
df1=
名称街道城市坐标
0 A0 B0 C0 1,1
1 A1 B0 C0 NaN
2 A2 B0 C0 NaN
3 A3 B2 C2南
4 A4 B2 C2 2,3
5 A5 B3 C3 NaN
6 A6 B3 C3 NaN
我希望结果是
df1=
名称街道城市坐标
0 A0 B0 C0 1,1
1 A1 B0 C0 1,1
2 A2 B0 C0 1,1
3 A3 B2 C2 2,3
4 A4 B2 C2 2,3
5 A5 B3 C3 NaN
6 A6 B3 C3 NaN
我想用相同的街道和城市更新坐标。
在上例中,索引0处的(B0,C0)具有坐标(1,1)。所以我需要将索引1和2的坐标更新为(1,1),因为它们有相同的街道和城市(B0,C0)。
实现这一目标的最佳方式是什么
另外,如果给我们一个数据帧列表,我如何以类似的方式更新所有数据帧。即
dfu列表=[df1,df2,…]
首先从所有数据帧生成具有唯一行的数据帧,然后使用此数据帧查找和更新每个数据帧是否是一个好主意?如果每个组中只有一个非
NaN
值可以与ffill
一起使用(与method='ffill'
一起使用):
解决方案包括:
或与:
第二种解决方案也适用于多个值-每组第一个正向填充值(不替换第一个值,保持NaN
),然后所有第一个值替换为反向填充:
print (df)
name street city coordinates
0 A0 B0 C0 1,1
1 A1 B0 C0 NaN
2 A2 B0 C0 NaN
3 A3 B2 C2 NaN
4 A4 B2 C2 2,3
5 A5 B2 C2 4,7
5 A6 B2 C2 NaN
df['coordinates'] = df.groupby(['street','city'])['coordinates']
.transform(lambda x: x.ffill().bfill())
print (df)
name street city coordinates
0 A0 B0 C0 1,1
1 A1 B0 C0 1,1
2 A2 B0 C0 1,1
3 A3 B2 C2 2,3
4 A4 B2 C2 2,3
5 A5 B2 C2 4,7
5 A6 B2 C2 4,7
你能解释一下为什么
坐标中的最后两个值是NaN的吗?应该是2,3
?对不起,我的错。我将更新问题。如何更新数据帧列表?i、 e如果列表中的任何数据帧中存在坐标,请使用空值更新所有行,并匹配所有数据帧中的其他列。我认为您需要先将所有数据帧与参数键连接在一起,应用解决方案,然后拆分它们。您能帮我将组合的数据帧拆分回数据帧列表吗?在做了下面的事情后,我被卡住了:df=pd.cancat(df_list,ignore_index=False)df['coordinates']=df.groupby(['street','city'])['coordinates'].transform(lambda x:x.dropna())你可以在df.groupby(level=0)中为I,x尝试L=[x.reset_index(level=0,drop=True)]
当数据帧具有[A5 B3 C3 NaN],[A6 B3 C3 NaN],[A6 B3 C3 NaN]时,使用groupby和transform的解决方案不起作用。
我得到“ValueError:传递的项目数错误0,放置意味着2”错误。很抱歉这么晚才指出:(
df['coordinates'] = df.groupby(['street','city'])['coordinates']
.transform(lambda x: x.dropna())
print (df)
name street city coordinates
0 A0 B0 C0 1,1
1 A1 B0 C0 1,1
2 A2 B0 C0 1,1
3 A3 B2 C2 2,3
4 A4 B2 C2 2,3
5 A5 B2 C2 2,3
5 A6 B2 C2 2,3
df['coordinates'] = df.groupby(['street','city'])['coordinates']
.transform(lambda x: x.ffill().bfill())
print (df)
name street city coordinates
0 A0 B0 C0 1,1
1 A1 B0 C0 1,1
2 A2 B0 C0 1,1
3 A3 B2 C2 2,3
4 A4 B2 C2 2,3
5 A5 B2 C2 2,3
5 A6 B2 C2 2,3
print (df)
name street city coordinates
0 A0 B0 C0 1,1
1 A1 B0 C0 NaN
2 A2 B0 C0 NaN
3 A3 B2 C2 NaN
4 A4 B2 C2 2,3
5 A5 B2 C2 4,7
5 A6 B2 C2 NaN
df['coordinates'] = df.groupby(['street','city'])['coordinates']
.transform(lambda x: x.ffill().bfill())
print (df)
name street city coordinates
0 A0 B0 C0 1,1
1 A1 B0 C0 1,1
2 A2 B0 C0 1,1
3 A3 B2 C2 2,3
4 A4 B2 C2 2,3
5 A5 B2 C2 4,7
5 A6 B2 C2 4,7