Soit avoir la fonction suivante qui retourne un tuple: 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
6 Réponses :
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.
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)
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.
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)
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))
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
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
@ 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
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