0
votes

Comment attribuer un élément en tuple lors de l'utilisation de la méthode "Appliquer" dans Pandas?

Soit avoir la fonction suivante qui retourne un tuple: xxx pré>

si j'utilise une méthode d'application, cela reviendrait: P>

df['test_1'] = df['col1'].apply(return_tuple)??? # get 0-index in tuple
df['test_2'] = df['col1'].apply(return_tuple)??? # get 1 index in tuple

>>
    col1    test_1    test_2
0   1         1        one
1   2         2        two
2   one       1        one


0 commentaires

6 Réponses :


0
votes
import pandas as pd

def return_tuple(x):
    if x in [1, '1', 'one']:
        return 1, 'one'
    else:
        return 2, 'two'


df_1 = pd.DataFrame({'col1': [1, 2, 3]})

df_1['test_1'] = df_1['col1'].apply(lambda item: return_tuple(item)[0])
df_1['test_2'] = df_1['col1'].apply(lambda item: return_tuple(item)[1])

print(df_1)
It's as simple as that! For more on lambda functions, you can see https://realpython.com/python-lambda/. There are a few relevant question on SO, like this one.

0 commentaires

1
votes

Vous pouvez également le faire en une seule étape:

import pandas as pd
df = pd.DataFrame({'col1': [1,2,3]})

def return_tuple(x):
    if x['col1'] in [1,'1','one']: 
        return pd.Series([1, 'one'])
    else:
        return pd.Series([2, 'two'])

df[['test_1', 'test_2']] = df.apply(return_tuple, axis=1)


2 commentaires

Cela rend la fonction beaucoup moins polyvalente, donc cela dépend de l'utilisation ou non ailleurs.


Point équitable. Cela pourrait être beaucoup moins flexible en fonction du cas d'utilisation. Mais sur la base de l'exemple montré, je pense que cette réponse pourrait bien wok aussi.



0
votes

Vous pouvez également faire cette doublure sans modifier votre fonction existante:

df[['test_1','test_2']] = pd.DataFrame(df['col1'].apply(return_tuple).tolist(),index=df.index)


0 commentaires

2
votes

Quelque part entre Alexander et Razdi's Réponses, en utilisant Zip CODE> et TUPLE DPACKING:

import pandas as pd

def return_tuple(x):
    if x in [1, '1', 'one']:
        return 1, 'one'
    else:
        return 2, 'two'

df_1 = pd.DataFrame({'col1': [1, 2, 3]})

df_1['test_1'], df_1['test_2'] = zip(*df_1['col1'].apply(return_tuple))


3 commentaires

1. Comment allez-vous partout? : P 2. Nice!


Je pourrais vous demander la même chose;)


Utilisation cool de l'opérateur de déballage: p



0
votes

Après un bit de modification, voici le résultat:

df[['test1', 'test2']] = pd.DataFrame(df['col1'].apply(return_tuple).tolist(), index=df.index)
df


4 commentaires

@ Chun-yin-to juste copier-coller pour vérifier


Ceci est une pâte de copie de ma réponse antérieure


@Deekekeden S'ils sont identiques, cela ne signifie pas une pâte de copie. Soyez trop confiant. Je peux montrer votre capture d'écran de mon ordinateur portable Jupyter


juste dire ... Vérifiez les réponses avant de poster la même chose



0
votes

Vous pouvez l'élargir pour faire ce que vous voulez:

def return_tuple(x):
    if x in [1,'1','one']: 
        return (1, 'one')
    else:
        return (2, 'two')

df = pd.DataFrame({'col1': [1,2,3]})
df['test'] = df['col1'].apply(return_tuple)


 df[['test','test2']] = pd.DataFrame(df['test'].to_list(), index=df.index)


Out[32]: 
   col1  test test2
0     1     1   one
1     2     2   two
2     3     2   two


0 commentaires