Python 基于其他行替换空值

Python 基于其他行替换空值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个包含许多列的数据框架(但这里只发布col1、col2、col3以简化发布): 我想用id中的值填充源id的none值。 例如,source\u id a5行没有必须替换为id a1值,随后,source\u id a6行没有必须替换为a5行 输出: id col1 col2 col3 source_id a1 765.3 234 cat a5 a2 3298.3 none dog a4 a3 876

我有一个包含许多列的数据框架(但这里只发布col1、col2、col3以简化发布):

我想用id中的
值填充源id的
none值。
例如,
source\u id a5行没有
必须替换为
id a1值
,随后,
source\u id a6行没有
必须替换为
a5行

输出:

id    col1       col2    col3   source_id
a1    765.3      234     cat    a5
a2    3298.3     none    dog    a4
a3    8762.1     27      rat    a8
a4    3298.3     none    dog    none       
a5    765.3      234     cat    a6
a6    765.3      234     cat    none

首先,似乎
none
是字符串,所以将它们替换为缺少的值:

df = df.mask(df.eq('none'), None)
然后在
networkx
中使用以下命令创建字典:

按映射的
id
列最后一组,并用正向和反向填充替换
None
s:

df1 = (df.groupby(df['id'].map(node2id))
         .apply(lambda x: x.ffill().bfill())
         .assign(source_id = df['source_id']))
print (df1)
   id    col1  col2 col3 source_id
0  a1   765.3   234  cat        a5
1  a2  3298.3  None  dog        a4
2  a3  8762.1    27  rat        a8
3  a4  3298.3  None  dog      None
4  a5   765.3   234  cat        a6
5  a6   765.3   234  cat      None

首先要做的是将id列设置为索引,以便查找该行以填充单元格

df = df.set_index('id')
然后,您可以在列上循环并填充它们

对于df.列中的列:
如果col=='source\u id':
持续
对于df.index中的idx:
dst_idx=df.source_id[idx]
如果(df[col][idx]!=“无”
和dst_idx!=“无”
和df.index中的dst_idx和
df[col][dst_idx]=“无”):
df[col][dst_idx]=df[col][idx]
col1 col2 col3源代码
身份证件
a1 765.3 234 a5类
a2 3298.3无狗a4
a3 8762.1 27大鼠a8
a4 3298.3无狗无
A5765.3 234 a6类
a6 765.3 234无类
df1 = (df.groupby(df['id'].map(node2id))
         .apply(lambda x: x.ffill().bfill())
         .assign(source_id = df['source_id']))
print (df1)
   id    col1  col2 col3 source_id
0  a1   765.3   234  cat        a5
1  a2  3298.3  None  dog        a4
2  a3  8762.1    27  rat        a8
3  a4  3298.3  None  dog      None
4  a5   765.3   234  cat        a6
5  a6   765.3   234  cat      None
df = df.set_index('id')