【问题标题】:Split Comma seperated values into multiple columns and an empty column next to it to map the name- Pandas将逗号分隔的值拆分为多列和旁边的空列以映射名称 - Pandas
【发布时间】:2020-11-05 19:15:27
【问题描述】:

我有一列用逗号分隔的数字现在应该将值拆分为新列。

 Site       UserId
   ABC           '456,567,67,96'
   DEF           '67,987'
 

新的 Dataframe 应该如下所示:

Site     UserID              UserId1  UserId2  UserId3  UserId4
ABC     '456,567,67,96'      456       567      67        96
DEF     '67,987'             67        987
POC     '4321,96,912         4321      87       912  

每列旁边还有一个空列,用于将数字与名称映射。 用户

 UserId UserName         Phone No 
  4321   EB_Meter         9980688666
    987    EB_Meter987    9255488721 
    912    DG_Meter912    8897634219
    567    Ups_Meter567   7263193155 
    456    Ups_Meter456   8987222112 
    96     DG_Meter96     
    67     DGB_Meter

所以最终的DataFrame是:

  Values              Value1  Name1            Phone1         Value2   Name2         Value3 Name3      Value4 Name4
 '456,567,67,96'       456    Ups_Meter456       8987222112    567      Ups_Meter567      67     DGB_Meter   96   DG_Meter96
    '67,987'            67    DGB_Meter                        987      EB_Meter987
    '4321,96,912        4321    EB_Meter          9980688666    96       DG_Meter96    912    DG_Meter912

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    Series.str.stripSeries.str.split 一起用于新的DataFrame

    df = df1['UserID'].str.strip("'").str.split(',',expand=True)
    print (df)
          0    1     2     3
    0   456  567    67    96
    1    67  987  None  None
    2  4321   96   912  None
    

    然后将df2['UserId']转换为字符串,用于映射由DataFrame.stack重塑的数据与Series.map,然后再由Series.unstack重塑回DataFrame

    df2['UserId'] = df2['UserId'].astype(str)
    s = df2.set_index('UserId')['UserName']
    df3 = df.stack(dropna=False).map(s).unstack()
    print (df3)
                  0             1            2           3
    0  Ups_Meter456  Ups_Meter567    DGB_Meter  DG_Meter96
    1     DGB_Meter   EB_Meter987          NaN         NaN
    2      EB_Meter    DG_Meter96  DG_Meter912         NaN
    

    通过concatMultiIndex 中的列顺序更改为DataFrame.sort_index,最后在列表理解中将MultiIndexf-strings 合并,并通过DataFrame.join 添加列df1[['UserID']]

    df = (pd.concat([df, df3], axis=1, keys=('Value','Name'))
            .sort_index(axis=1, level=[1,0], ascending=[True, False]))
    df.columns = [f'{x}{y+1}' for x, y in df.columns]
    df = df1.join(df)
    print (df)
              UserID Value1         Name1 Value2         Name2 Value3  \
    0  456,567,67,96    456  Ups_Meter456    567  Ups_Meter567     67   
    1         67,987     67     DGB_Meter    987   EB_Meter987   None   
    2    4321,96,912   4321      EB_Meter     96    DG_Meter96    912   
    
             Name3 Value4       Name4  
    0    DGB_Meter     96  DG_Meter96  
    1          NaN   None         NaN  
    2  DG_Meter912   None         NaN  
    

    如有必要,将None/NaNs 替换为DataFrame.fillna 为空字符串:

    df = df.fillna('')
    print (df)
    
              UserID Value1         Name1 Value2         Name2 Value3  \
    0  456,567,67,96    456  Ups_Meter456    567  Ups_Meter567     67   
    1         67,987     67     DGB_Meter    987   EB_Meter987          
    2    4321,96,912   4321      EB_Meter     96    DG_Meter96    912   
    
             Name3 Value4       Name4  
    0    DGB_Meter     96  DG_Meter96  
    1                                  
    2  DG_Meter912                     
    

    【讨论】:

    • 该解决方案工作正常,但是原始文件中有许多列(Site 等)以及 UserId..所以最终的数据框也应该包括这些列..
    • @Harishreddy - 将 df = df1[['UserID']].join(df) 更改为 df = df1.join(df)
    • 嗨@jezrael我也想添加电话号码列..但是代码返回错误df3=df.stack(dropna=False).map(s).unstack()..那里没有重复的电话号码,但它返回错误“重新索引仅对具有唯一值的索引对象有效”
    • @Harishreddy - 你能发布新问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2018-11-11
    • 2018-07-27
    • 2018-11-02
    • 2015-10-06
    相关资源
    最近更新 更多