【问题标题】:python pandas merge two or more lines of text into one linepython pandas将两行或多行文本合并为一行
【发布时间】:2017-07-03 13:28:40
【问题描述】:

我有如下文本数据的数据框,

    name | address                  | number 
1   Bob    bob                        No.56
2          @gmail.com           
3   Carly  carly@world.com            No.90
4   Gorge  greg@yahoo     
5          .com                   
6                                     No.100

并且想把它做成这样的框架。

    name | address               | number 
1   Bob    bob@gmail.com           No.56
2   Carly  carly@world.com         No.90                 
3   Gorge  greg@yahoo.com          No.100

我正在使用 pandas 读取文件,但不知道如何使用合并或连接。

【问题讨论】:

    标签: python pandas merge concat


    【解决方案1】:

    如果name 列包含唯一值,

    print df
    
        name          address  number
    0    Bob              bob   No.56
    1    NaN       @gmail.com     NaN
    2  Carly  carly@world.com   No.90
    3  Gorge       greg@yahoo     NaN
    4    NaN             .com     NaN
    5    NaN              NaN  No.100
    
    df['name'] = df['name'].ffill()
    print df.fillna('').groupby(['name'], as_index=False).sum()
    
        name          address  number
    0    Bob    bob@gmail.com   No.56
    1  Carly  carly@world.com   No.90
    2  Gorge   greg@yahoo.com  No.100
    

    您可能需要ffill()bfill()[::-1].groupby('name').apply(lambda x: ' '.join(x['address']))strip()lstrip()rstrip()replace() 之类的东西来将上述代码扩展到更复杂的数据。

    【讨论】:

      【解决方案2】:

      如果要转换性别行的数据框(每列中可能有 NaN 条目),可能没有直接的 pandas 方法。

      您将需要一些代码来分配name 列中的值,以便pandas 可以知道bob@gmail.com 的拆分行属于同一用户Bob

      您可以使用fillnaffill 方法将name 列中的每个空条目填充为其前一个用户,请参阅pandas dataframe missing data

      df ['name'] = df['name'].ffill()
      
      # gives
          name    address number
      0   Bob bob No.56
      1   Bob @gmail.com  
      2   Carly   carly@world.com No.90
      3   Gorge   greg@yahoo  
      4   Gorge   .com    
      5   Gorge       No.100
      

      那么你可以使用groupbysum作为聚合函数。

      df.groupby(['name']).sum().reset_index()
      
      # gives
          name    address number
      0   Bob bob@gmail.com   No.56
      1   Carly   carly@world.com No.90
      2   Gorge   greg@yahoo.com  No.100
      

      您可能会发现在NaN 和空白之间进行转换很有用,请参阅Replacing blank values (white space) with NaN in pandaspandas.DataFrame.fillna

      【讨论】:

        猜你喜欢
        • 2019-01-11
        • 1970-01-01
        • 2022-10-16
        • 2021-05-11
        • 1970-01-01
        • 1970-01-01
        • 2015-02-08
        • 1970-01-01
        • 2012-12-29
        相关资源
        最近更新 更多