Pandas:根据两个不同的列创建唯一值的索引

我正在为一个正在创建航线的项目完善代码。我目前拥有的是由 c_match 的索引值组合在一起的数据帧。很酷,很棒,乍一看一切看起来都是正确的。


航线是一组具有相同折扣和最低费用的州。我的代码返回具有相同折扣的州。大多数具有相同折扣的州也具有相同的最低费用。然而,异常值是具有相同折扣和不同最低费用的州。


目标:创建具有相同最低费用和相同折扣百分比的航线。


我的想法:创建一个逻辑运算,将具有相同费率和成本的州名称连接起来,并返回其费率和成本。仍然需要考虑到相同费率下具有不同成本的州。


期望的输出:


Shipping Lane                                 Rate  Cost

20_21_RDWY_Purple_AL_AR_KY_LA_MS_SC_TN_PE   50.80%  120

20_21_RDWY_Purple_AZ                        50.80%  155

20_21_RDWY_Purple_CA                        62.40%  145

20_21_RDWY_Purple_CO_ND_WY_MB_NF_PQ         62.40%  155

20_21_RDWY_Purple_CT_DE_MN_NE               50.00%  145

20_21_RDWY_Purple_DC_IA_KS_MD_MI_OH_OK_WI   49.00%  125

20_21_RDWY_Purple_FL                        48.30%  125

当前代码

def remove_dups(input, output):

    input.sort()

    n_list = list(input for input, _ in itertools.groupby(input))

    output.append(n_list)



def get_matches_discount(state):

    state_groups = []

    state_rates = []

    state_cost = []

    final_format = []


    match = []

    c_match = []

   

    for i, x in enumerate(df_d[state]):

        #checks within the column for identical values then maps where the identical values are

        match1 = [j for j, y in enumerate(df_d[state].isin([x])) if y is True]

        match.append(match1)

        remove_dups(match, c_match)



    for list in c_match:


        for elements in list:

            r = elements[0]

            state_g = df_d.index[elements]

            state_groups.append(state_g)


            state_r = df_d[state][r]

            state_rates.append(state_r)

            print(state_rates)

            match_cost = df_m[state][r]

            state_cost.append(match_cost)


    for i in state_groups:

        delimiter = "_"


        join_str = delimiter.join(i)


        j_str = "20_21_RDWY_Purple_" + join_str


        final_format.append(j_str)


    master_frame = pd.DataFrame(

        {'Shipping Lane': final_format,

         'Rate': state_rates,

         'Cost': state_cost,

         }

    )

    print(master_frame)

    return master_frame


输入示例:

最低收费表


元芳怎么了
浏览 160回答 2
2回答

慕雪6442864

您有多个状态行,但它们也位于列上。看来您只是显示了该AL列的示例输出?您可以在State和 然后.groupby Rate和上合并两个数据框Cost。.apply(lambda x: '_'.join(x))然后,返回具有相同费率和成本的州的连接字符串(带有)(因为您按它们分组,所以它们将具有相同的费率和成本):master_dataframe0 = (pd.merge(df_d[['State', 'AL']], df_m[['State', 'AL']], how='inner', on='State')                    .rename({'AL_x' : 'Rate', 'AL_y' : 'Cost'}, axis=1)                    .groupby(['Rate', 'Cost'])['State'].apply(lambda x: '_'.join(x)).reset_index()                    .sort_values('State'))master_dataframe0 = master_dataframe0[['State', 'Rate', 'Cost']].assign(State='20_21_RDWY_Purple_' + master_dataframe0['State'])master_dataframe0Out[1]:                                      State    Rate   Cost7   20_21_RDWY_Purple_AL_AR_KY_LA_MS_SC_TN  50.80%  120.011                    20_21_RDWY_Purple_AZ  56.70%  155.015                    20_21_RDWY_Purple_CA  62.40%  145.09                  20_21_RDWY_Purple_CO_ND  54.30%  155.05            20_21_RDWY_Purple_CT_DE_MN_NE  50.00%  145.04   20_21_RDWY_Purple_DC_IA_KS_MD_MI_OH_OK  49.00%  125.03                     20_21_RDWY_Purple_FL  48.30%  125.018                    20_21_RDWY_Purple_GA  67.90%  120.014              20_21_RDWY_Purple_ID_MT_NV  61.80%  145.00            20_21_RDWY_Purple_IL_IN_MO_NC  44.10%  120.016                    20_21_RDWY_Purple_MA  63.50%  155.08         20_21_RDWY_Purple_ME_NH_NM_RI_SD  53.90%  155.06                     20_21_RDWY_Purple_NJ  50.50%  145.013                    20_21_RDWY_Purple_NY  61.10%  145.017                    20_21_RDWY_Purple_OR  64.40%  185.02                     20_21_RDWY_Purple_PA  47.20%  145.010                    20_21_RDWY_Purple_TX  56.60%  125.01                     20_21_RDWY_Purple_UT  45.00%  170.012                    20_21_RDWY_Purple_VA  57.90%  120.0

翻过高山走不出你

借助 Erickson 的 和 lambda 函数帮助.groupby,我们得出了正确的解决方案:pd.set_option('display.max_rows', None)pd.set_option('display.max_columns', None)pd.set_option('display.width', None)pd.set_option('display.max_colwidth', None)df_d = pd.read_excel(path,                        sheet_name=0,                        header=0,                        index_col=False,                        keep_default_na=True)df_m = pd.read_excel(path2,                       sheet_name=0,                       header=0,                       index_col=False,                       keep_default_na=True)m_col_names = ['AL', 'AR', 'AZ', 'CA', 'CO', 'CT', 'DC', 'DE', 'FL', 'GA', 'IA', 'ID', 'IL', 'IN', 'KS', 'KY', 'LA',               'MA', 'MD', 'ME', 'MI', 'MN', 'MO', 'MS', 'MT', 'NC', 'ND', 'NE', 'NH', 'NJ', 'NM', 'NV', 'NY', 'OH',               'OK', 'OR', 'PA', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VA', 'VT', 'WA', 'WI', 'WV', 'WY', 'AB', 'BC',               'MB', 'NB', 'NF', 'NS', 'ON', 'PE', 'PQ', 'SK']final_frame = pd.DataFrame()for state in m_col_names:    master_dataframe0 = (pd.merge(df_d[['State', state]], df_m[['State', state]], how='inner', on='State')                         .rename({state + '_x': 'Rate', state + '_y': 'Cost'}, axis=1)                         .groupby(['Rate', 'Cost'])['State'].apply(lambda x: '_'.join(x)).reset_index()                         .sort_values('State'))    master_dataframe0['Origin'] = state    master_dataframe0 = master_dataframe0[['State', 'Rate', 'Cost', 'Origin']].assign(        State='20_21_RDWY_Purple_' + master_dataframe0['State'])    final_frame = final_frame.append(master_dataframe0)    print(final_frame)    final_frame.to_excel("w3llshipmeright.xlsx")正确输出:
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python