web-dev-qa-db-fra.com

UserWarning: les pandas ne permettent pas la création de colonnes via un nouvel attribut: df2.a = df2.apply (lambda x: Calculate_latoffset (x [b]), axis = 1)

Je suis coincé avec mon script de pandas.

En fait, je travaille avec deux fichiers csv (une entrée et une autre fichier de sortie) . Je veux copier toutes les lignes de deux colonnes et je veux faire un calcul, puis le copier dans un autre cadre de données (fichier de sortie).

Les colonnes sont les suivantes:

'lat', 'long','PHCount', 'latOffset_1', 'longOffset_1','PH_Lat_1', 'PH_Long_1', 'latOffset_2', 'longOffset_2', 'PH_Lat_2', 'PH_Long_2', 'latOffset_3', 'longOffset_3','PH_Lat_3', 'PH_Long_3',  'latOffset_4', 'longOffset_4','PH_Lat_4', 'PH_Long_4'.

je veux prendre la colonne 'lat' et 'latOffset_1', faire un calcul et le mettre dans une autre nouvelle colonne ('PH_Lat_1') que j'ai déjà créée.

Ma fonction est:

def calculate_latoffset(latoffset):  #Calculating Lat offset.
    a=(df2['lat']-(2*latoffset))
    return a

Le code principal:

for i in range(1,5):
        print(i)
        a='PH_lat_%d' % i 
        print (a)
        b='latOffset_%d' % i
        print (b)
        df2.a = df2.apply(lambda x: calculate_latoffset(x[b]), axis=1)

Puisque le nom de la colonne ne diffère que de (1,2,3,4). Je souhaite donc appeler la fonction Calculate_latoffset et calculer toutes les lignes de toutes les colonnes (PH_Lat_1, PH_Lat_2, PH_Lat_3, PH_Lat_4) en une seule fois.

En utilisant le code ci-dessus, j'obtiens cette erreur:

basic_conversion.py:46: UserWarning: Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access
  df2.a = df2.apply(lambda x: calculate_latoffset(x[b]), axis=1)

est-ce possible? S'il vous plaît, veuillez aider

5
Bushra Ghazal

Utilisez simplement df2['a'] au lieu de df2.a

4
AaronDT

La solution à laquelle je peux penser est d'utiliser .loc pour obtenir la colonne. Vous pouvez essayer df.loc[:,a] au lieu de df.a. Les colonnes Pandas dataframe ne peuvent pas être créées à l'aide de la méthode dot pour éviter tout conflit éventuel avec les attributs dataframe. J'espère que cela t'aides

2
Ying Cai

Dans df2.apply(lambda x: calculate_latoffset(x[b]), axis=1), vous créez une structure de données à 5 colonnes et vous tentiez d'attribuer la valeur à un seul champ. Ne df2[a] = calculate_latoffset(df2[b]) à la place devrait fournir le résultat souhaité.

0
bowei