J'ai une trame de données comme ci-dessous:

      Player Name       Headline
1     LeBron James      LeBron James suggests 5-10 games before playoff
2     LeBron James      LeBron James (groin) probable for Thursday 
3     LeBron James      LeBron James overcomes Pelicans with 34/13/12
4     LeBron James      LeBron James (groin) plans to play on Tuesday   
5     LeBron James      LeBron James (rest) questionable Tuesday      
6     LeBron James      LeBron James (leg) will start on Saturday   
7     LeBron James      LeBron James (hip) is questionable 
8     Ryan Anderson     Anderson (flu) returns against Cavs on Sunday   
9     Ryan Anderson     Ryan Anderson out with respiratory infection   
10    Ryan Anderson     Anderson (rest) not playing 

Je souhaite supprimer toutes les lignes qui ne contiennent aucun (text) dans la colonne Titre. De plus, je souhaite avoir deux nouvelles colonnes intitulées Injury/Rest et Location comme ci-dessous.

La nouvelle sortie de données que je souhaite:

      Player Name       Headline                           Injury/Rest  Location
2     LeBron James      LeBron James (groin) probable...   Injury       groin
4     LeBron James      LeBron James (groin) plans...      Injury       groin
5     LeBron James      LeBron James (rest) questionable.. Rest         rest
6     LeBron James      LeBron James (leg) will...         Injury       leg
7     LeBron James      LeBron James (sore hip) is...      Injury       sore hip
8     Ryan Anderson     Anderson (flu) returns...          Injury       flu
10    Ryan Anderson     Anderson (rest) not...             Rest         rest

Comme vous pouvez le voir, les lignes sans (text) dans la colonne Titre ont été supprimées. Ceux qui ont (text) ont ensuite été classés dans une nouvelle colonne Injury/Rest et Location comme ci-dessus.

J'ai fait df1 = df[df['Headline'].str.contains("(rest)")] pour extraire toutes les (rest) lignes de la colonne Titre. Il y a plus de 100 000 lignes donc je ne sais pas comment faire chaque blessure dans le ( ) et ajouter des données dans les deux nouvelles colonnes.

Comment obtenir la sortie que je souhaite nettoyer la trame de données?

0
Sunny 5 juin 2020 à 01:44

3 réponses

Meilleure réponse

Voici ce que je ferais:

df['Location'] = df.Headline.str.extract('\((.*)\)')[0]
df = df[df['Location'].notnull()]
df['Injury/Rest'] = np.where(df['Location'].eq('rest'), 'Rest', 'Injury')

Production:

    Player Name    Headline                                       Location    Injury/Rest
--  -------------  ---------------------------------------------  ----------  -------------
 2  LeBron James   LeBron James (groin) probable for Thursday     groin       Injury
 4  LeBron James   LeBron James (groin) plans to play on Tuesday  groin       Injury
 5  LeBron James   LeBron James (rest) questionable Tuesday       rest        Rest
 6  LeBron James   LeBron James (leg) will start on Saturday      leg         Injury
 7  LeBron James   LeBron James (hip) is questionable             hip         Injury
 8  Ryan Anderson  Anderson (flu) returns against Cavs on Sunday  flu         Injury
10  Ryan Anderson  Anderson (rest) not playing                    rest        Rest
1
Quang Hoang 4 juin 2020 à 22:49
              #keep only rows that have text bounded within brackets
res = (df.loc[df.Headline.str.contains(r"\(.+\)")]
              #extract text within brackets
       .assign(Location = lambda x: x.Headline.str.extract(r"((?<=[(]).+(?=\)))"),
               Injury_Rest = lambda x: np.where(x.Location.eq("rest"), "Rest","Injury")
              )
      )

res


     Player Name    Headline                                           Location Injury_Rest
2   LeBron James    LeBron James (groin) probable for Thursday          groin   Injury
4   LeBron James    LeBron James (groin) plans to play on Tuesday       groin   Injury
5   LeBron James    LeBron James (rest) questionable Tuesday            rest    Rest
6   LeBron James    LeBron James (leg) will start on Saturday           leg  Injury
7   LeBron James    LeBron James (hip) is questionable                  hip Injury
8   Ryan Anderson   Anderson (flu) returns against Cavs on Sunday       flu Injury
10  Ryan Anderson   Anderson (rest) not playing                         rest    Rest
1
sammywemmy 4 juin 2020 à 23:01

Vous pouvez accomplir cela comme ceci:

import pandas as pd


def get_injury_rest(value):
    if "(rest)" in value.lower():
        return "Rest"
    elif "(" and ")" in value:
        return "Injury"


df = pd.read_csv("Players.csv")
df.loc[:, "Injury/Rest"] = [get_injury_rest(value) for value in df.loc[:, Headline"]]
df = df.dropna()
df.loc[:, "Location"] = [value.split("(")[1].split(")")[0] for value in df.loc[:, "Headline"]]
0
Rexovas 4 juin 2020 à 23:00