交叉表思路

 

 

def cross_analysis(variable_list, table_name, sub_area):
    # print(variable_list)
    # data = cross_analysis(["TPWL", "TPEB", "TPTOPA"], data_all, area)
    # TPWL是省份数据, TPEB是X  TPTOPA是Y,进行交叉, area是河北, 这里要用全国的数据才可以
    # ["Q29_2", "Q42", "Q29_1"]  -> ["Q42", "Q29_1"]
    #    省份     X      Y
    result = read_indexs_by_index(table_name, variable_list)

    result_sort_data = result.dropna(how='all').sort_values(by=variable_list, ascending=False)  # 出现了没有按照顺序columns
    """
        PXD   PSM  PPL
    41      5   8.0  卓资县
    229     5   7.0  卓资县
    246     5   8.0  卓资县
    """
    # print(result_sort_data)

    # 需要算两种值,一个是全国的,一个是局部的。
    # 全国的只需要后两个
    all_the_country_value_lables = value_lables[variable_list[1]]  # 得到的是变量x的
    # print(all_the_country_value_lables)  # {1: '幼儿园', 2: '小学', 3: '初中', 4: '高中', 5: '职业高中/中专/技校'}
    cross_dict_data = {"全国": {}, sub_area: {}}
    for i in all_the_country_value_lables.keys():
        # 全国对应值标签的count
        atc_data = result_sort_data[(result_sort_data[variable_list[1]] == i)].iloc[:, len(variable_list) - 1]
        # print("全国的:atc_data:\n ", atc_data)
        """
        可以理解为得到y
        1359746    19.0
        1347442    17.0
        1367416    16.0
        1334097    15.0
                   ... 
        963347      7.0
        
        可以理解为series
        """
        try:
            cross_dict_data["全国"][all_the_country_value_lables[i]] = float(
                "%.4f" % (atc_data.sum() / atc_data.count()))
            # print("i: \n", i)
            # print("sum(atc_data): \n", atc_data.sum())
            # print("atc_data.count(): \n", atc_data.count())
        except:
            cross_dict_data["全国"][all_the_country_value_lables[i]] = float("%.4f" % (0.0000))

        # -----------------------------------------------------------------------------------------#
        atd_data = result_sort_data[(result_sort_data[variable_list[0]].map(lambda x: (sub_area in x))) & (
                result_sort_data[variable_list[1]] == i)].iloc[:, len(variable_list) - 1]
        # print(atd_data)
        try:
            cross_dict_data[sub_area][all_the_country_value_lables[i]] = float(
                "%.4f" % (sum(atd_data) / atd_data.count()))
        except:
            cross_dict_data[sub_area][all_the_country_value_lables[i]] = float("%.4f" % (0.0000))
    return pd.DataFrame(cross_dict_data)

 

posted @ 2022-12-27 10:57  我当道士那儿些年  阅读(7)  评论(0编辑  收藏  举报