J'ai un problème pour filtrer la colonne d'une trame de données qui résulte d'une fusion entre une base de données de base et une autre provenant d'un groupe avec plusieurs colonnes de sortie.Filtrage de colonnes par nom sur une base de données résultant d'une fusion avec des noms de colonnes multiniveaux
Permettez-moi d'être plus précis:
1) Je construis mon cadre de données "étrange": df_analyzed:
n_elements = 1000;
np.random.seed(1234);
X1 = np.random.randint(10,size=n_elements)*2;
X2 = np.random.normal(size=n_elements);
Y = 4*X1+X2;
df = pd.DataFrame({'X1':X1,'X2':X2,'Y':Y})
df_analyzed = df[['X1','Y']] .groupby('X1').agg([np.count_nonzero,np.mean,np.std]).rename(columns={'count_nonzero':'count','mean':'average'}).reset_index();
2) Je construis mon cadre de données de base: DF2:
df2 = pd.DataFrame({'X1':np.array(range(10))*2,'Y_true':np.array(range(10))*2*4})
3) puis-je fusionner sur X1:
df2 = df2.merge(df_analyzed,on='X1', how='inner')
Mon problème maintenant: comment puis-je filtrer la colonne de DF2 par nom?
Le problème concerne les noms de colonne à plusieurs niveaux de df_analyzed qui génère des noms composés avec des parenthèses.
df2.columns
donne:
Index ([ 'X1', 'Y_true_x', ('X1', ''), ('Y', 'count'), ('Y », 'moyen') ('Y', 'std'), 'Y_true_y'], DTYPE = 'objet')
Le point est que:
df2[['X1', ('Y', 'average')]]
ne fonctionne pas, alors que:
df2[['X1']]
et
df2[[ ('Y', 'average')]]
fonctionnent.
Quel est le truc? Quelle est la meilleure pratique?
Merci,
Denis
Merci, cela résout le problème à la fin. Est-ce la meilleure pratique?ou est-ce qu'il n'y a aucune chance de filtrer par les noms de colonnes en utilisant quelque chose comme 'df2 [['X1', ('Y', 'average')]]'? – DenisM
Je pense que le meilleur est que les colonnes soient aplaties. – jezrael
J'ajoute une solution pour le filtrage. – jezrael