基于其他行中其他列的匹配值更新列的空填充行

2024-04-27 03:57:50 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个如下的数据帧:

df1= 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 B3 C3 NaN 6 A6 B3 C3 NaN

我希望结果是

df1= 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 B3 C3 NaN 6 A6 B3 C3 NaN 我想用相同的街道和城市更新坐标。 在上例中,索引0处的(B0,C0)具有坐标(1,1)。所以我需要将索引1和索引2的坐标更新为(1,1),因为它们有相同的街道和城市(B0,C0)。 实现这一目标的最佳方法是什么?你知道吗

另外,如果给我们一个数据帧列表,我如何以类似的方式更新所有的数据帧。即 df_list = [df1,df2,..] 首先从所有数据帧中生成一个具有唯一行的数据帧,然后使用这个数据帧查找和更新每个数据帧是一个好主意吗?你知道吗


Tags: 数据namestreetcitya1nanb0a0
1条回答
网友
1楼 · 发布于 2024-04-27 03:57:50

如果每个组中只有一个非NaN值可以使用^{}ffill^{}method='ffill'):

df = df.sort_values(['street','city','coordinates'])
df['coordinates'] = df['coordinates'].ffill()
print (df)
  name street city coordinates
0   A0     B0   C0         1,1
1   A1     B0   C0         1,1
2   A2     B0   C0         1,1
4   A4     B2   C2         2,3
3   A3     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.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

第二种解决方案也适用于多个值—首先对每个组前向填充值(不替换第一个值,保持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

相关问题 更多 >