Procesamiento de división de datos (basado en la estructura de datos del marco de datos en pandas de python)

Procesamiento de división de datos (basado en la estructura de datos del marco de datos en pandas de python)

A menudo necesitamos obtener subtablas relacionadas de una tabla.

Como en la pregunta: Obtenga la variación anual de las reservas de oro, plata y cobre de la tabla de recursos primarios por país. (como muestra la imagen)

Un enfoque más simple puede ser: bucles múltiples

Pero el editor a menudo no está satisfecho con este método de procesamiento, por el contrario, prefiere usar funciones relacionadas existentes para procesar toda la tabla al mismo tiempo.

 

 

Al analizar los problemas prácticos anteriores, si los conjuntos de datos se dividen primero en tres conjuntos de datos por país (Wei, Shu, Wu), las reservas pueden determinarse únicamente por (nombre del recurso, año) .

Al igual que df['gold']['1960'] = 11 , donde df es un marco de datos vacío generado por adelantado.

data_Shu = data[data['国家'] == '蜀']
data_Wu = data[data['国家'] == '吴']
data_Wei = data[data['国家'] == '魏']

El resultado de data_Shu es:  

  Nombre del recurso País Año Reservas
0 Oro Shu 1960 11
1 Oro Shu 1961 12
2 Oro Shu 1962 13
3 Plata Shu 1960 14
4 Plata Shu 1961 15
5 Plata Shu 1962 16 6 Cobre Shu
1960 17 7 Cobre Shu
1961 18 8 Cobre
Shu 1962 19

Entonces, el problema puede verse como la generación de un nuevo marco de datos a partir de este marco de datos, con el nombre del recurso listado como columnas, el año listado como índice y las reservas como datos.

Aquí, el editor pregunta a los grandes: ¿ Hay alguna función ya preparada que pueda realizar tal función?

El editor no lo sabe, así que necesito escribir esa función yo mismo, y la situación de la llamada es la siguiente:

df = create_df_by_2col(data_Shu, -1, 2, 0)  
# 意思是由数据框data_Shu,以最后一列"储量"为要填充的数据,
# 以第二列"年份"为index,以第0列"资源名"为columns,生成新的数据框df

La definición específica de la función es la siguiente:

def create_df_by_2col(dataframe, col_no_as_data, col_no_as_index, col_no_as_columns):
    columns = dataframe.columns.tolist() # 结果为 ['资源名', '国家', '年份', '储量']
    new_data_name = columns[col_no_as_data]
    new_index_name = columns[col_no_as_index]
    new_columns_name = columns[col_no_as_columns]
#    index_from_col = dataframe[new_index_name]
#    columns_from_col = dataframe[new_columns_name]
    index_from_col = dataframe.iloc[:,col_no_as_index].unique()
    columns_from_col = dataframe.iloc[:,col_no_as_columns].unique()
    # 创建一个空的dataframe
    df = pd.DataFrame(index = index_from_col, columns = columns_from_col)
    for row in dataframe.itertuples():
        # 如 df['金']['1960'] = 11
        df[getattr(row, new_columns_name)][getattr(row, new_index_name)] = getattr(row, new_data_name)
    return df

Entonces el resultado se puede obtener con el siguiente código

df_Shu = create_df_by_2col(data_Shu, -1, 2, 0)
df_Wu  = create_df_by_2col(data_Wu, -1, 2, 0)
df_Wei = create_df_by_2col(data_Wei, -1, 2, 0)

El resultado de df_Shu es:

       Oro Plata Cobre
1960 11 14 17
1961 12 15 18
1962 13 16 19

Hasta ahora, el problema ha llegado a su fin.

Ahora, si desea utilizar (oro, plata, cobre y hierro) como columnas en el marco de datos original (sin hierro), ¿qué debe hacer?

col_index = [1960,1961,1962]
col_columns = ['金','银','铜','铁']
df2_Shu = by_2col(data_Shu,-1,col_index,col_columns)

def by_2col(dataframe, col_data_index, col_index, col_columns):
    # 创建一个空的dataframe
    df = pd.DataFrame(index = col_index, columns = col_columns)
    for index, row in dataframe.iterrows():  
        row = row.tolist()
        df[row[0]][row[2]] = row[col_data_index] # 当然这些数字也可以变成函数的参数
    return df

Finalmente, el editor aún pregunta sinceramente, ¿ hay alguna función ya preparada que pueda realizar tal función? A partir de este marco de datos, el nombre del recurso se enumera como columnas, el año se enumera como índice y las reservas se utilizan como datos para generar un nuevo marco de datos.

Espero tener una respuesta, o tener una mejor manera, no dude en comentar, ¡gracias!

 

Supongo que te gusta

Origin blog.csdn.net/Cameback_Tang/article/details/102876947
Recomendado
Clasificación