【问题标题】:Merge and create multiple columns based in the number of columns present in the dataframe- Pandas根据数据框中存在的列数合并和创建多个列 - Pandas
【发布时间】:2021-02-18 01:59:50
【问题描述】:

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

 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         PhoneNo 
  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        Phone2       Value3  Name3        Phone3    Value4 Name4  Phone 4
 '456,567,67,96'      456     Ups_Meter456    8987222112      567      Ups_Meter567  7263193155     67      DGB_Meter               96   DG_Meter96
 '67,987'             67      DGB_Meter                        987      EB_Meter987   9255488721
 '4321,96,912         4321    EB_Meter          9980688666    96       DG_Meter96                  912    DG_Meter912  8897634219

【问题讨论】:

  • 这个问题和this one有什么不同?
  • 您可以尝试.str.split(expand=True) 处理第一个问题,第二个问题使用.map 处理每一列。
  • @MayankPorwal 当我使用“df.stack(dropna=False).map(s).unstack()”时出现以下错误-“重新索引仅对唯一值索引对象有效”虽然有没有重复的电话号码..
  • 列的顺序在输出中重要吗?
  • @jezrael 我不认为列的顺序很重要

标签: python pandas numpy automation


【解决方案1】:

这里为每个UserId 添加了多个列,因此map 使用meltmerge 中的左连接,重塑由DataFrame.pivot 创建:

df2['UserId'] = df2['UserId'].astype(str)
df3 = df1['UserId'].str.strip("'").str.split(',',expand=True)

df3 = (df3.reset_index()
          .melt('index', value_name='UserId')
          .merge(df2, on='UserId', how='left')
          .pivot(index='index', columns='variable')
          .sort_index(axis=1, level=1, sort_remaining=False)
          )
df3.columns = df3.columns.map(lambda x: f'{x[0]}_{x[1] + 1}')

df = df1.join(df3)
print (df)
  Site         UserId UserId_1    UserName_1   PhoneNo_1 UserId_2  \
0  ABC  456,567,67,96      456  Ups_Meter456  8987222112      567   
1  DEF         67,987       67     DGB_Meter         NaN      987   

     UserName_2   PhoneNo_2 UserId_3 UserName_3 PhoneNo_3 UserId_4  \
0  Ups_Meter567  7263193155       67  DGB_Meter       NaN       96   
1   EB_Meter987  9255488721     None        NaN       NaN     None   

   UserName_4 PhoneNo_4  
0  DG_Meter96       NaN  
1         NaN       NaN  

    

【讨论】:

  • ValueError:索引包含重复条目,无法重塑
  • @Harishreddy - 这意味着数据框中有重复的行,我猜在 df2 中,对于某些用途是多个电话号码,这是预期的吗?
  • 用户ID和电话号码是唯一的,但在某些情况下用户名是相同的
  • @Harishreddy - 如果没有欺骗,仍然无法工作?输入数据中返回什么print (df2['UserId'].duplicated(keep=False).sum())
  • @Harishreddy - 将 .sort_index(axis=1, level=1) 更改为 .sort_index(axis=1, level=1, sort_remaining=False),因为已编辑。
【解决方案2】:

你可以使用:

df[[ 'UserId1', 'UserId2', 'UserId3', 'UserId4']] = df['UserId'].str.split(",", expand=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    相关资源
    最近更新 更多