J'ai une trame de données pandas qui ressemble à ci-dessous. Il compte environ un million de lignes.

name = ['Jake','Matt', 'Henry']

0   A        
1 Jake Hill
2 Matt Dawn
3 Matt King
4 White Henry
5 Hyde Jake

Je veux parcourir la liste et la colonne df ['A'] et ne renvoyer que les prénoms. Par exemple, la trame de données finale devrait ressembler à ceci.

0   A
1  Jake
2  Matt
3  Matt
4  Henry
5  Jake

Merci d'avance. Je suis nouveau sur python, donc je trouve toujours le moyen le plus simple de le faire.

3
Matt 20 nov. 2018 à 08:29

7 réponses

Meilleure réponse

Vous avez besoin:

first_name = ['Jake','Matt', 'Henry']

df = pd.DataFrame({'A': ['Jake Hill', 'Matt Dawn', 'Matt King', 'Henry White','Jake Hyde','Dwayne John']})

def func(x):
    for k in first_name:
        if k in x:
            return k 
    return x

df['A'] = df['A'].apply(lambda x: func(x))

Production:

            A
0           Jake
1           Matt
2           Matt
3          Henry
4           Jake
5    Dwayne John
2
AkshayNevrekar 20 nov. 2018 à 05:53

Voici une méthode pour y parvenir:

first_name = ['Jake','Matt', 'Henry']

df = pd.DataFrame({'A': ['Jake Hill', 'Matt Dawn', 'Matt King', 'Henry White', 'Jake Hyde']})

df['B'] = df['A'].str.split().apply(lambda x: x[0] if x[0] in first_name else ' '.join(x))

Et vous obtenez:

             A      B
0    Jake Hill   Jake
1    Matt Dawn   Matt
2    Matt King   Matt
3  Henry White  Henry
4    Jake Hyde   Jake
2
Gerges 20 nov. 2018 à 05:37
name = ['Jake','Matt', 'Henry']
df = pd.read_csv("file.csv")

#filling nan values in-case if it is there
df.fillna(0, inplace = True)
df["First Name"] = df.A.apply(lambda x: list(set(x.split(" ")) & set(name))[0]  if x != 0 else "Not Found")

Production:

             A First Name
0    Jake Hill       Jake
1    Matt Dawn       Matt
2    Matt King       Matt
3  Henry White      Henry
4    Hyde Jake       Jake
0
Srce Cde 20 nov. 2018 à 05:51

Cette méthode ne sera pas dupée par un nom de famille contenant l'une des chaînes de prénoms, comme "Matten" ou "Jakes", et combinera un prénom et un nom de famille s'ils se trouvent tous les deux dans la liste des prénoms, tels que "Matt Henry" (affiche "MattHenry" dans la trame de données de sortie).

# split the name strings into columns as new dataframe
df1 = df.A.str.split(' ', expand=True)
# Keep the first names in the new dataframe and fill the rest with
# empty strings, then sum the df1 column string values to make a new array
names_result = np.where(df1.isin(name), df1, '').sum(axis=1)
# find the array indexes where no first names were found
no_match_idx = np.where(names_result == '')[0]
# fill the no first name index locations with original dataframe values
names_result[no_match_idx] = df.A.values[no_match_idx]
# make a dataframe using the results
df_out = pd.DataFrame(names_result, columns=['A'])

# to find names with a first and last name that are both found in the
# first names list:
# df_out['dups'] = df1.isin(name).sum(axis=1) > 1
0
b2002 21 nov. 2018 à 02:38

Vous avez une liste de noms à associer et une série de noms à comparer. Utilisez une expression régulière avec str.extract ici.

df.A.str.extract(r'({})'.format('|'.join(name)))
       0
0   Jake
1   Matt
2   Matt
3  Henry
4   Jake
3
user3483203 20 nov. 2018 à 05:59

En plus de l'édition précédente, que j'ai compris maintenant, vous voulez remplacer le remplacement, ce qui peut être fait avec la compréhension de la liste comme suit en divisant la colonne A Fist et choisissez le premier index de celui-ci et en passant à lambda en utilisant {{ Méthode X1}}.

Structure DataFrame:

df
             A
0    Jake Hill
1    Matt Dawn
2    Matt King
3  Henry White
4    Jake Hyde

Votre name Var ..

$ name
['Jake', 'Matt', 'Henry']

Votre ensemble de données final souhaité:

Le paramètre n peut être utilisé pour limiter le nombre de divisions dans la sortie.

df['A'] = df['A'].str.split(n=1, expand=True)[0].apply(lambda x: x if x in name else ' '.join(x))

   print(df)
           A
    0   Jake
    1   Matt
    2   Matt
    3  Henry
    4   Jake

Cela devrait être simple si vous n'avez pas appuyé sur pour prendre les noms d'un Var et l'objectif final est d'obtenir le prénom du dataframe:

>>> df
             A
0    Jake Hill
1    Matt Dawn
2    Matt King
3  Henry White
4    Jake Hyde


>>> df['A'].str.split(n=1, expand=True)[0]
0     Jake
1     Matt
2     Matt
3    Henry
4     Jake
Name: 0, dtype: object

OU Si vous souhaitez un remplacement sur place de la colonne A ..

df['A'] = df['A'].str.split(n=1, expand=True)[0]
0
Karn Kumar 20 nov. 2018 à 06:55

Essayez d'utiliser:

A_final = A [0] .str.split ('', expand = True, n = 1) .str.get (0) A_final [0] , votre problème est résolu.

0
Jeet Bhattachariya 20 nov. 2018 à 06:05