如何用pandas/python合并(内部)数据帧的两列



我有一个包含两列的数据帧;A_ ID和R_。

我想更新R_ID,使其只包含同样在A_ID中的值,其余的应该删除(同样是NaN(。这些值应保持在相同的位置/索引。我知道这是一个内部连接,但在我提出的解决方案中,我遇到了几个问题。

示例:

import pandas as pd
data = {'A_ID': ['1E2', '1E3', '1E4', '1E5'], 'R_ID': ['1E7',[np.nan],[np.nan],"1E4",]}
df = pd.DataFrame(data)
print(df)

我试过

df_A_ID = df[["A_ID"]]
df_R_ID = df[["R_ID"]]
new_df = pd.merge(df_A_ID, df_R_ID, how='inner', left_on='A_ID', right_on ='R_ID', right_index=True)

new_df = pd.concat([dataset_A_ID, dataset_R_ID],join="inner")

但对于第一种选择;您正试图在object和int64列上合并";错误,即使这两列都是d.types对象,并且第二列是空的DataFrame。

我的预期输出将是与以前相同的数据帧,但R_ID只包含同样在A_ID列中的值,位于相同的索引/位置:

data = {'A_ID': ['1E2', '1E3', '1E4', '1E5'], 'R_ID': [[np.nan],[np.nan],[np.nan],"1E4",]}
df = pd.DataFrame(data)
print(df)

如果Series.isin:没有匹配列,则通过Series.where设置NaN

#solution working with scalar NaNs
data = {'A_ID': ['1E2', '1E3', '1E4', '1E5'], 'R_ID': ['1E7',np.nan,np.nan,"1E4",]}
df = pd.DataFrame(data)
print(df)
A_ID R_ID
0  1E2  1E7
1  1E3  NaN
2  1E4  NaN
3  1E5  1E4
df['R_ID'] = df['R_ID'].where(df["R_ID"].isin(df["A_ID"]))
print(df)
A_ID R_ID
0  1E2  NaN
1  1E3  NaN
2  1E4  NaN
3  1E5  1E4

或者:

df.loc[~df["R_ID"].isin(df["A_ID"]), 'R_ID'] = np.nan

使用isin:

df['R_ID'] = df['R_ID'].loc[df['R_ID'].isin(df['A_ID'])]
>>> df
A_ID R_ID
0  1E2  NaN
1  1E3  NaN
2  1E4  NaN
3  1E5  1E4

它应该可以工作

df_A_ID = df[["A_ID"]].astype(dtype=pd.StringDtype())
df_R_ID = df[["R_ID"]].astype(dtype=pd.StringDtype()).reset_index()
temp_df = pd.merge(df_A_ID, df_R_ID, how='inner', left_on='A_ID', right_on ='R_ID').set_index('index')
df.loc[~(df_R_ID.isin(temp_df[['R_ID']])['R_ID']).fillna(False),'R_ID'] = [np.nan]

输出

A_ID R_ID
0  1E2  NaN
1  1E3  NaN
2  1E4  1E4
3  1E5  NaN

最新更新