在Python中,如何比较两个dataframe的列并在它们匹配时产生结果

2024-10-02 16:26:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图让Python比较两个数据帧。在dataframe1中,我有两列(accat和Origin)。我试图将AC Cat列与数据帧2的输入进行比较。如果在Dataframe 2的一列和正在研究的Dataframe 1的值之间发现匹配,我想将找到匹配的Dataframe 2的列的标题复制到Dataframe 1中的一个新列。你知道吗

DF1型:

f = {'AC-Cat': pd.Series(['B737', 'A320', 'MD11']),
      'Origin': pd.Series(['AJD', 'JFK', 'LRO'])}
Flight_df = pd.DataFrame(f)

DF2型:

w = {'CAT-C': pd.Series(['DC85', 'IL76', 'MD11', 'TU22', 'TU95']),
      'CAT-D': pd.Series(['A320', 'A321', 'AN12', 'B736', 'B737'])}
WCat_df = pd.DataFrame(w)

我将pandas作为pd导入,numpy作为np导入,并尝试定义一个函数来比较这些列。你知道吗

def get_wake_cat(AC_cat):
    try:
        Wcat = [WCat_df.columns.values[0]][WCat_df.iloc[:,1]==AC_cat].values[0]
    except:
        Wcat = np.NAN
    return Wcat

Flight_df.loc[:,'CAT'] = Flight_df.loc[:,'AC-Cat'].apply(lambda CT: get_wake_cat(CT))

但是,该功能不会产生所需的输出。例如:取B737 AC Cat值。我希望Python在DF2的CAT-D列中找到这个值,并将这个头复制到df1的新列中。这种情况不会发生。有人能帮我找出为什么我的代码没有给出期望的结果吗?你知道吗


Tags: 数据dataframedforiginaccatseriesflight
3条回答

IUC,你可以做^{}^{}

final=(Flight_df.merge(WCat_df.stack().reset_index(1,name='AC-Cat'),on='AC-Cat',how='left')
 .rename(columns={'level_1':'New'}))
print(final)

或使用^{}

final=Flight_df.merge(WCat_df.melt(var_name='New',value_name='AC-Cat'),
                                                on='AC-Cat',how='left')

  AC-Cat Origin    New
0   B737    AJD  CAT-D
1   A320    JFK  CAT-D
2   MD11    LRO  CAT-C

这将为您提供两个新列,其中包含找到的匹配项的名称:

Flight_df['CAT1'] = Flight_df['AC-Cat'].map(lambda x: 'CAT-C' if x in list(WCat_df['CAT-C']) else '')
Flight_df['CAT2'] = Flight_df['AC-Cat'].map(lambda x: 'CAT-D' if x in list(WCat_df['CAT-D']) else '')
Flight_df.loc[Flight_df['CAT1'] == '', 'CAT1'] = Flight_df['CAT2']
Flight_df.loc[Flight_df['CAT1'] == Flight_df['CAT2'], 'CAT2'] = ''

不漂亮,但我想我成功了。部分错误是该函数没有WCat\u df。我还将索引改为两个步骤:

def get_wake_cat(AC_cat, WCat_df):
    try:
        d=WCat_df[WCat_df.columns.values][WCat_df.iloc[:]==AC_cat]
        Wcat=d.columns[(d==AC_cat).any()][0]
    except:
        Wcat = np.NAN
    return Wcat

然后您需要将下一行更改为:

Flight_df.loc[:,'CAT'] = Flight_df.loc[:,'AC-Cat'].apply(lambda CT: get_wake_cat(CT,WCat_df ))


   AC-Cat   Origin  CAT
0   B737    AJD CAT-D
1   A320    JFK CAT-D
2   MD11    LRO CAT-C

希望能解决问题

相关问题 更多 >