pandas 基于公共值合并

pxq42qpu  于 2023-04-19  发布在  其他
关注(0)|答案(3)|浏览(104)

有没有一种方法可以根据公共值合并列,如果没有匹配则返回NAN。我尝试了下面的代码,但输出很奇怪。即使没有匹配,值也会返回

import pandas as pd

data2 = {'Name' : ['Tom', 'Nick', 'f']}
d2 = pd.DataFrame(data2)

data1 = {'Name' : ['Tom', 'Nick', 'h', 'g']}
d1 = pd.DataFrame(data1)

(d1 d2)

pd.merge(d2, d1, left_index=True, right_index=True, how='left') 

  Name_x Name_y
0    Tom    Tom
1   Nick   Nick
2      f      h

但预期输出(d1对d2)

Name_x Name_y
0    Tom    Tom
1   Nick   Nick
2      f      NaN

类似地(d1上的d2)

pd.merge(d1, d2, left_index=True, right_index=True, how='left')
Out[17]: 
  Name_x Name_y
0    Tom    Tom
1   Nick   Nick
2      h      f
3      g    NaN

预期输出(d1上的d2)

Name_x Name_y
0    Tom    Tom
1   Nick   Nick
2      h    NaN
3      g    NaN

因此,基本上,它应该比较2个 Dataframe ,并根据不匹配的值,它应该返回NaN

k2arahey

k2arahey1#

请查看您的帖子上的评论,但您可以在事后进行比较,并在不匹配时替换为NaN。

df = pd.merge(d1, d2, left_index=True, right_index=True, how='left')
print(len(df))
for x in range(len(df)):
    if df['Name_x'][x] != df['Name_y'][x]:
        df['Name_y'][x] = np.NaN

print(df)
Name_x Name_y
0    Tom    Tom
1   Nick   Nick
2      h    NaN
3      g    NaN
b4lqfgs4

b4lqfgs42#

按您调用的方式合并将使用索引。您的数据框将索引设置为数值范围(默认值)。您需要将Name设置为索引(或以其他方式调用合并)。

import pandas as pd
 
data2 = {'Name' : ['Tom', 'Nick', 'f']}
d2 = pd.DataFrame(data2)
d2.set_index('Name',drop=False,inplace=True)
                                             
data1 = {'Name' : ['Tom', 'Nick', 'h', 'g']}
d1 = pd.DataFrame(data1)
d1.set_index('Name',drop=False,inplace=True)
                                              
print(pd.merge(d2, d1, left_index=True, right_index=True, how='left'))
ubof19bj

ubof19bj3#

通过使用indicator参数和np.where子句(基于合并标记重新分配值):

df_ = d1.merge(d2, how='left', indicator='Name_y').rename({'Name': 'Name_x'}, axis=1)
df_['Name_y'] = np.where(df_['Name_y'].eq('both'), df_['Name_x'], pd.NA)
print(df_)
Name_x Name_y
0    Tom    Tom
1   Nick   Nick
2      h   <NA>
3      g   <NA>

相关问题