如何在 Pandas DataFrame 中使用共享列值替换特定行?

4

假设我有以下Pandas数据框:

import pandas as pd

data = [['Alex',10],['Bob',12],['Clarke',13], ['Bob', '#'], ['Bob', '#'], ['Bob', '#']]

df = pd.DataFrame(data,columns=['Name','Age'], dtype=float)
print(df)
     Name Age
0    Alex  10
1     Bob  12
2  Clarke  13
3     Bob   #
4     Bob   #
5     Bob   #

因此,DataFrame中对于Bob的行数是奇数,即第3、4和5行。这些值始终为“#”,而不是12。第1行显示Bob应该是12,而不是“#”。
在这个例子中,使用replace()很容易解决这个问题:
df = df.replace("#", 12)
print(df)
     Name Age
0    Alex  10
1     Bob  12
2  Clarke  13
3     Bob   12
4     Bob   12
5     Bob   12

然而,这对于更大的数据框不起作用,例如

     Name Age
0    Alex  10
1     Bob  12
2  Clarke  13
3     Bob   #
4     Bob   #
5     Bob   #
6  Clarke   #

第6行应为6 Clarke 13

如何根据Name替换Age中带有#的任何一行,并使用其他行中给定的正确整数进行替换?如果#存在,则检查具有相同名称值的其他行并替换#


1
“#”是实际的“#”,还是NaN或其他什么东西? - rafaelc
@RafaelC 这些实际上是字符 #,这很奇怪,我知道。 - ShanZhengYang
2个回答

2
你想要使用有效值来填充无效值吗?在这种情况下,请使用map
v = df.assign(Age=pd.to_numeric(df['Age'], errors='coerce')).dropna()
df['Age'] = df['Name'].map(v.set_index('Name').Age)  

df
     Name   Age
0    Alex  10.0
1     Bob  12.0
2  Clarke  13.0
3     Bob  12.0
4     Bob  12.0
5     Bob  12.0
6  Clarke  13.0

2

试试这个:

d= df[df['Age']!='#'].set_index('Name')['Age']
df['Age']=df['Name'].replace(d)

输出:

     Name Age
0    Alex  10
1     Bob  12
2  Clarke  13
3     Bob  12
4     Bob  12
5     Bob  12
6  Clarke  13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接