如何用pandas DataFrame中的共享列值替换某些行?

时间:2018-12-05 04:16:48

标签: python pandas dataframe

假设我有以下熊猫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值的其他行,并替换#

2 个答案:

答案 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