Si vous souhaitez ajouter une colonne n'importe où dans le Pandas DataFrame, utilisez pandas.DataFrame.insert Cela peut être réalisé en l'utilisant, mais il y a quelques plaintes.
--Non immuable (DataFrame est directement réécrit / méthode destructive / pas d'option en place)
J'ai écrit une fonction pratique pour résoudre ces problèmes.
from typing import Union, Optional
import pandas as pd
def insert_columns(
df: pd.DataFrame,
data: Union[pd.Series, pd.DataFrame],
*,
before: Optional[str] = None,
after: Optional[str] = None,
allow_duplicates: bool = False,
inplace: bool = False,
) -> pd.DataFrame:
if not inplace:
df = df.copy()
if not (after is None) ^ (before is None):
raise ValueError('Specify only "before" or "after"')
if before:
loc = df.columns.get_loc(before)
else:
loc = df.columns.get_loc(after) + 1
if type(data) is pd.Series:
df.insert(loc, data.name, data, allow_duplicates)
elif type(data) is pd.DataFrame:
for column in data.columns[::-1]:
df.insert(loc, column, data[column], allow_duplicates)
return df
--Spécifiez le nom de la colonne pour «avant» ou «après» --Par défaut, le DataFrame d'entrée n'est pas directement réécrit. --Récrire directement en spécifiant ʻinplace = True`
Utilisez l'ensemble de données iris de sklearn comme exemple de données.
from sklearn import datasets
iris = datasets.load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
target = pd.Series(iris.target_names[iris.target], name='target')
df.head()
target.head()
Essayez d'ajouter une cible après «largeur sépale (cm)» dans df.
insert_columns(df, target, after='sepal width (cm)')
Dans cet exemple, Series est ajouté, mais DataFrame peut également être spécifié.
Recommended Posts