Hello(Pandas Python(简而言之,我有一个由用户id列(user_id(组成的数据帧,它的组织在第二列中附加,它的机构在第三列中合并,很明显,在第三列中,所有的都没有合并组织,因此有Na,也可能是重复了相同的base_org,但这一列没有合并,这是所希望的,数据帧看起来是这样的:
User_id | Base_org | Merge_org|
---|---|---|
A | 苹果 | Na|
B | ||
C | Xbox | 微软 |
谷歌 | ||
E | Na |
np.where
选项:
df['Base_org'] = np.where(
df['Merge_org'].eq('Na'), df['Base_org'], df['Merge_org']
)
df
:
User_id Base_org Merge_org
0 A Apple Na
1 B Facebook Facebook
2 C Microsoft Microsoft
3 D Google Na
4 E Instagram Na
尝试:
df['Base_org'] = df.mask(df['Merge_org'] == 'Na')['Merge_org'].fillna(df['Base_org'])
df
输出:
User_id Base_org Merge_org
0 A Apple Na
1 B Facebook Facebook
2 C Microsoft Microsoft
3 D Google Na
4 E Instagram Na
我不知道你的实际意图,但通常最好用基值覆盖合并值中的na,而不是覆盖"基本";具有非null的值合并在值中。
你可以用一个简单的df.loc()
语句来解决你的直接问题。
df.loc[df.Merge_org != "Na", 'Base_org'] = df.Merge_org
输出:
User_id Base_org Merge_org
0 A Apple Na
1 B Facebook Facebook
2 C Microsoft Microsoft
3 D Google Na
4 E Instagram Na
这种方法和类似的方法消除了两行的基本值实际上是Instagram和XBox的事实。如果要保留所有三列,那么可以像这样从左到右进行替换,保留原始数据和新数据。
df.loc[df.Merge_org == "Na", 'Merge_org'] = df.Base_org
输出:
User_id Base_org Merge_org
0 A Apple Apple
1 B Instagram Facebook
2 C Xbox Microsoft
3 D Google Google
4 E Instagram Instagram
此输出更适用于调试和进一步开发。
def replace_base_org(base_org, merge_org):
return merge_org if merge_org != 'Na' else base_org
df['Base_org'] = df.apply(lambda row : replace_base_org(row['Base_org'],row['Merge_org']), axis = 1)