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