J'ai un Pandas DataFrame et je veux combiner les colonnes «lat» et «long» pour former un tuple.
<class 'pandas.core.frame.DataFrame'>
Int64Index: 205482 entries, 0 to 209018
Data columns:
Month 205482 non-null values
Reported by 205482 non-null values
Falls within 205482 non-null values
Easting 205482 non-null values
Northing 205482 non-null values
Location 205482 non-null values
Crime type 205482 non-null values
long 205482 non-null values
lat 205482 non-null values
dtypes: float64(4), object(5)
Le code que j'ai essayé d'utiliser était:
def merge_two_cols(series):
return (series['lat'], series['long'])
sample['lat_long'] = sample.apply(merge_two_cols, axis=1)
Cependant, cela a renvoyé l'erreur suivante:
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
<ipython-input-261-e752e52a96e6> in <module>()
2 return (series['lat'], series['long'])
3
----> 4 sample['lat_long'] = sample.apply(merge_two_cols, axis=1)
5
...
AssertionError: Block shape incompatible with manager
Comment puis-je résoudre ce problème?
list
. Cela devrait fonctionner:df['new_col'] = list(zip(df.lat, df.long))
list(zip(df.lat, df.long))
en 124 ms est beaucoup plus efficace qu'endf[['lat', 'long']].apply(tuple, axis=1)
14,2 s pour 900 000 lignes. Le ratio est supérieur à 100.df['new_col'] = list(zip(df[cols_to_keep]))
mais je reçois toujours une erreur:Length of values does not match length of index
un conseil?df['new_col'] = list(zip(*[df[c] for c in cols_to_keep])
la source
Pandas a la
itertuples
méthode pour faire exactement cela:la source
Je voudrais ajouter
df.values.tolist()
. (tant que cela ne vous dérange pas d'obtenir une colonne de listes plutôt que des tuples)la source
%timeit df[['a', 'b']].values.tolist()
. C'est encore beaucoup plus rapide.