Python pandas: remove everything after a delimiter in a string

前端 未结 4 697
隐瞒了意图╮
隐瞒了意图╮ 2020-12-01 03:00

I have data frames which contain e.g.:

"vendor a::ProductA"
"vendor b::ProductA"
"vendor a::Productb"

I need to

相关标签:
4条回答
  • 2020-12-01 03:24

    If it is in a specific column (having name: column) of a data frame (having name: dataframe), you can also use

    dataframe.column.str.replace("(::).*","")
    

    It gives you the below result

             column        new_column       
    0  vendor a::ProductA  vendor a
    1  vendor b::ProductA  vendor b
    2  vendor a::Productb  vendor a
    

    By using this you need not specify any position, as it gets rid of anything present after '::'

    I guess this might come oh help,Good luck!

    0 讨论(0)
  • 2020-12-01 03:24

    there is your function:

    def do_it(str):
      integer=0
      while integer<len(str):
          if str[integer]==':' :
            if str[integer+1]==':' :
              str=str.split(':')[0]
              break;
          integer=integer+1    
      return (str)
    

    pass the original string in there. And get the new trimmed string.

    0 讨论(0)
  • 2020-12-01 03:38

    You can use str.replace(":", " ") to remove the "::". To split, you need to specify the character you want to split into: str.split(" ")

    The trim function is called strip in python: str.strip()

    Also, you can do str[:7] to get just "vendor x" in your strings.

    Good luck

    0 讨论(0)
  • 2020-12-01 03:47

    You can use pandas.Series.str.split just like you would use split normally. Just split on the string '::', and index the list that's created from the split method:

    >>> df = pd.DataFrame({'text': ["vendor a::ProductA", "vendor b::ProductA", "vendor a::Productb"]})
    >>> df
                     text
    0  vendor a::ProductA
    1  vendor b::ProductA
    2  vendor a::Productb
    >>> df['text_new'] = df['text'].str.split('::').str[0]
    >>> df
                     text  text_new
    0  vendor a::ProductA  vendor a
    1  vendor b::ProductA  vendor b
    2  vendor a::Productb  vendor a
    

    Here's a non-pandas solution:

    >>> df['text_new1'] = [x.split('::')[0] for x in df['text']]
    >>> df
                     text  text_new text_new1
    0  vendor a::ProductA  vendor a  vendor a
    1  vendor b::ProductA  vendor b  vendor b
    2  vendor a::Productb  vendor a  vendor a
    

    Edit: Here's the step-by-step explanation of what's happening in pandas above:

    # Select the pandas.Series object you want
    >>> df['text']
    0    vendor a::ProductA
    1    vendor b::ProductA
    2    vendor a::Productb
    Name: text, dtype: object
    
    # using pandas.Series.str allows us to implement "normal" string methods 
    # (like split) on a Series
    >>> df['text'].str
    <pandas.core.strings.StringMethods object at 0x110af4e48>
    
    # Now we can use the split method to split on our '::' string. You'll see that
    # a Series of lists is returned (just like what you'd see outside of pandas)
    >>> df['text'].str.split('::')
    0    [vendor a, ProductA]
    1    [vendor b, ProductA]
    2    [vendor a, Productb]
    Name: text, dtype: object
    
    # using the pandas.Series.str method, again, we will be able to index through
    # the lists returned in the previous step
    >>> df['text'].str.split('::').str
    <pandas.core.strings.StringMethods object at 0x110b254a8>
    
    # now we can grab the first item in each list above for our desired output
    >>> df['text'].str.split('::').str[0]
    0    vendor a
    1    vendor b
    2    vendor a
    Name: text, dtype: object
    

    I would suggest checking out the pandas.Series.str docs, or, better yet, Working with Text Data in pandas.

    0 讨论(0)
提交回复
热议问题