【问题标题】:Split and Join Series in PandasPandas 中的拆分和加入系列
【发布时间】:2016-06-18 03:28:32
【问题描述】:

我在下面的数据框中有两个系列。第一个是一个字符串,它将出现在第二个中,它将是一个 url 字符串。我想要做的是通过连接额外的字符来更改第一个系列,并将该更改应用于第二个字符串。

import pandas as pd
#import urlparse

d = {'OrigWord' : ['bunny', 'bear', 'bull'], 'WordinUrl' : ['http://www.animal.com/bunny/ear.html', 'http://www.animal.com/bear/ear.html', 'http://www.animal.com/bull/ear.html'] }

df = pd.DataFrame(d)

def trial(source_col, dest_col):
    splitter = dest_col.str.split(str(source_col))
    print type(splitter)
    print splitter
    res = 'angry_' + str(source_col).join(splitter)
    return res

df['Final'] = df.applymap(trial(df.OrigWord, df.WordinUrl))

我正在尝试find the string from the source_col,然后在dest_col 中的那个字符串上split,然后对dest_col 中的字符串进行更改。在这里,我将它作为一个名为Final 的新系列,但我宁愿就地。我认为主要问题是 splitter 变量,它不起作用以及函数的应用。

结果应该是这样的:

      OrigWord                                   WordinUrl
  angry_bunny  http://www.animal.com/angry_bunny/ear.html
  angry_bear   http://www.animal.com/angry_bear/ear.html
  angry_bull   http://www.animal.com/angry_bull/ear.html

【问题讨论】:

    标签: python pandas join split series


    【解决方案1】:

    apply 并不是真正设计为应用于同一行中的多个列。您可以做的是更改您的函数,以便它接受一个系列,然后将 source_col、dest_col 分配给系列中的适当值。一种方法如下:

    def trial(x):
        source_col = x["OrigWord"]
        dest_col = x['WordinUrl' ]
        splitter = str(dest_col).split(str(source_col))
        res = splitter[0] + 'angry_' + source_col + splitter[1]
        return res
    
    
    df['Final'] = df.apply(trial,axis = 1 )
    

    【讨论】:

      【解决方案2】:

      这是另一种方法:

      df['WordinUrl'] = (df.apply(lambda x: x.WordinUrl.replace(x.OrigWord,
                                                                'angry_' + x.OrigWord), axis=1))
      
      In [25]: df
      Out[25]:
        OrigWord                                   WordinUrl
      0    bunny  http://www.animal.com/angry_bunny/ear.html
      1     bear   http://www.animal.com/angry_bear/ear.html
      2     bull   http://www.animal.com/angry_bull/ear.html
      

      【讨论】:

      • 这是我认为最好的答案,因为它是就地的,而且不需要创建函数,只需使用 lambda。谢谢
      【解决方案3】:

      您可以使用replace 方法将angry_ 添加到相应的源之前,而不是使用split

      def trial(row):
          row.WordinUrl = row.WordinUrl.replace(row.OrigWord, "angry_" + row.OrigWord)
          row.OrigWord = "angry_" + row.OrigWord
          return row
      
      df.apply(trial, axis = 1)
      
          OrigWord    WordinUrl
      0   angry_bunny http://www.animal.com/angry_bunny/ear.html
      1   angry_bear  http://www.animal.com/angry_bear/ear.html
      2   angry_bull  http://www.animal.com/angry_bull/ear.html
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-30
        • 2017-09-18
        • 1970-01-01
        • 2020-12-16
        • 2016-09-10
        • 2023-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多