假设我有以下熊猫DataFrame:
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 #
因此,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
。
如何基于Age
用其他行中给出的正确整数将#
中的任何行替换为Name
?如果存在#
,请检查具有相同Name值的其他行,并替换#
。
答案 0 :(得分: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
答案 1 :(得分:2)
尝试一下
d= df[df['Age']!='#'].set_index('Name')['Age']
df['Age']=df['Name'].replace(d)
O / P:
Name Age
0 Alex 10
1 Bob 12
2 Clarke 13
3 Bob 12
4 Bob 12
5 Bob 12
6 Clarke 13