J'essaie d'accomplir une tâche simple de couper tout blanc sur chaque colonne de mon Dataframe. J'ai des valeurs qui ont des espaces de fuite après des mots, avant des mots et des colonnes contenant uniquement une valeur J'ai lu Ce message qui a donné un excellent moyen d'accomplir ceci:
Cependant, je reçois souvent ce qui suit: P> "" code>. Je veux tout ça dépouillé.
data_frame_trimmed = data_frame.apply (lambda x: x.strip () si x.dtype == "objet" else x) code> p>
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-9-31d35db1d48c> in <module>
1 df = (pd.read_csv('C:\\Users\\wundermahn\Desktop\\aggregated_po_data.csv',
----> 2 encoding = "ISO-8859-1", low_memory=False).apply(lambda x: x.str.strip() if (x.dtype == "object") else x))
3 print(df.shape)
4
5 label = df['class']
c:\python367-64\lib\site-packages\pandas\core\frame.py in apply(self, func, axis, raw, result_type, args, **kwds)
6876 kwds=kwds,
6877 )
-> 6878 return op.get_result()
6879
6880 def applymap(self, func) -> "DataFrame":
c:\python367-64\lib\site-packages\pandas\core\apply.py in get_result(self)
184 return self.apply_raw()
185
--> 186 return self.apply_standard()
187
188 def apply_empty_result(self):
c:\python367-64\lib\site-packages\pandas\core\apply.py in apply_standard(self)
294 try:
295 result = libreduction.compute_reduction(
--> 296 values, self.f, axis=self.axis, dummy=dummy, labels=labels
297 )
298 except ValueError as err:
pandas\_libs\reduction.pyx in pandas._libs.reduction.compute_reduction()
pandas\_libs\reduction.pyx in pandas._libs.reduction.Reducer.get_result()
<ipython-input-9-31d35db1d48c> in <lambda>(x)
1 df = (pd.read_csv('C:\\Users\\wundermahn\Desktop\\aggregated_data.csv',
----> 2 encoding = "ISO-8859-1", low_memory=False).apply(lambda x: x.str.strip() if (x.dtype == "object") else x))
3 print(df.shape)
4
5 label = df['ON_TIME']
c:\python367-64\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
5268 or name in self._accessors
5269 ):
-> 5270 return object.__getattribute__(self, name)
5271 else:
5272 if self._info_axis._can_hold_identifiers_and_holds_name(name):
c:\python367-64\lib\site-packages\pandas\core\accessor.py in __get__(self, obj, cls)
185 # we're accessing the attribute of the class, i.e., Dataset.geo
186 return self._accessor
--> 187 accessor_obj = self._accessor(obj)
188 # Replace the property with the accessor object. Inspired by:
189 # http://www.pydanny.com/cached-property.html
c:\python367-64\lib\site-packages\pandas\core\strings.py in __init__(self, data)
2039
2040 def __init__(self, data):
-> 2041 self._inferred_dtype = self._validate(data)
2042 self._is_categorical = is_categorical_dtype(data)
2043 self._is_string = data.dtype.name == "string"
c:\python367-64\lib\site-packages\pandas\core\strings.py in _validate(data)
2096
2097 if inferred_dtype not in allowed_types:
-> 2098 raise AttributeError("Can only use .str accessor with string values!")
2099 return inferred_dtype
2100
**AttributeError: Can only use .str accessor with string values!**
3 Réponses :
Vous pouvez essayer essayer code> à la place:
Utilisation de SELECT_DTYPES CODE> Pour sélectionner les colonnes correctes:
str_cols = df.select_dtypes('object').columns
df[str_cols] = df[str_cols].apply(lambda x: x.str.strip())
print(df)
col1 col2 col3 col4
0 1 a 4.0 foo
1 2 b 5.0 bar
2 3 c 6.0 foobar.
Votre approche est similaire à OP. Il échouera s'il y a une colonne avec, par exemple, des valeurs de liste.
C'est une bonne tentative! Je ne l'ai pas abordé de cette façon, mais ce que j'ai trouvé, c'est que objet code> contient des valeurs différentes. Par exemple, parfois
a code> et parfois 1 et parfois
"" code>
Vous devez vérifier le type de colonne, mais le type de chaque individuel forte>,
Donc, le code peut être E.G.: Mais de cette façon, vous exécutez inutilement le code des colonnes de types de types
autre que objet em>, où rien ne sera changé.
Si cela vous dérange, exécutez ce code uniquement pour les colonnes dans lesquelles il est probable
Pour changer quoi que ce soit: p> cols = df.select_dtypes(include='object').columns
df[cols] = df[cols].applymap(lambda x: x.strip() if type(x) == str else x)
Savez-vous à l'avance quel est le type de vos colonnes?
Je ne. C'est le problème - le Dataframe me donne une sorte de question sous la forme d'une requête
SQL code>. Je ne sais pas grand chose sur les données du tout. Et la forme est sur
(401801, 267) code>, il est donc assez lourd de tenter de passer par la colonne par colonne. Je suis désolé @Riccardobucco