Traitement de la division des données (basé sur la structure de données de la trame de données dans les pandas de python)

Traitement de la division des données (basé sur la structure de données de la trame de données dans les pandas de python)

Nous avons souvent besoin d'obtenir des sous-tables liées à partir d'une table.

Comme dans la question : Obtenir la variation annuelle des réserves d'or, d'argent et de cuivre à partir du tableau des ressources primaires par pays. (comme le montre l'image)

Une approche plus simple peut être : plusieurs boucles

Mais l'éditeur n'est souvent pas satisfait de ce mode de traitement, préférant au contraire utiliser des fonctions existantes apparentées pour traiter l'ensemble de la table en même temps.

 

 

En analysant les problèmes pratiques ci-dessus, si les ensembles de données sont d'abord divisés en trois ensembles de données par pays (Wei, Shu, Wu), les réserves peuvent être déterminées de manière unique par (nom de la ressource, année) .

Tout comme df['gold']['1960'] = 11 , où df est une trame de données vide générée à l'avance.

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

Le résultat de data_Shu est :  

  Nom de la ressource Pays Année Réserves
0 Or Shu 1960 11
1 Or Shu 1961 12
2 Or Shu 1962 13
3 Argent Shu 1960 14
4 Argent Shu 1961 15
5 Argent Shu 1962 16 6 Cuivre Shu
1960 17 7 Cuivre Shu
1961 18 8 Cuivre
Shu 1962 19

Ainsi, le problème peut être considéré comme générant une nouvelle trame de données à partir de cette trame de données, avec le nom de la ressource répertorié en colonnes, l'année répertoriée en tant qu'index et les réserves en tant que données.

Ici, l'éditeur demande aux gros bonnets : Existe-t-il une fonction toute faite qui puisse réaliser une telle fonction ?

L'éditeur ne le sait pas, j'ai donc besoin d'écrire une telle fonction moi-même, et la situation d'appel est la suivante :

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

La définition spécifique de la fonction est la suivante :

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

Donc le résultat peut être obtenu par le code suivant

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)

Le résultat de df_Shu est :

       Or Argent Cuivre
1960 11 14 17
1961 12 15 18
1962 13 16 19

Jusqu'à présent, le problème est résolu.

Maintenant, si vous souhaitez utiliser (or, argent, cuivre et fer) comme colonnes dans le bloc de données d'origine (sans fer), que devez-vous faire ?

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

Enfin, l'éditeur demande toujours sincèrement, existe-t-il une fonction toute faite qui puisse réaliser une telle fonction ? À partir de cette trame de données, le nom de la ressource est répertorié sous forme de colonnes, l'année est répertoriée comme index et les réserves sont utilisées comme données pour générer une nouvelle trame de données.

J'espère avoir une réponse, ou avoir un meilleur moyen, n'hésitez pas à commenter, merci!

 

Je suppose que tu aimes

Origine blog.csdn.net/Cameback_Tang/article/details/102876947
conseillé
Classement