Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将逗号分隔的值拆分为多列,并在其旁边添加一个空列,以映射名称-熊猫_Python_Pandas_Numpy - Fatal编程技术网

Python 将逗号分隔的值拆分为多列,并在其旁边添加一个空列,以映射名称-熊猫

Python 将逗号分隔的值拆分为多列,并在其旁边添加一个空列,以映射名称-熊猫,python,pandas,numpy,Python,Pandas,Numpy,我有一个用逗号分隔的数字列,现在这些值应该被拆分成新的列 Site UserId ABC '456,567,67,96' DEF '67,987' 新的数据帧应如下所示: Site UserID UserId1 UserId2 UserId3 UserId4 ABC '456,567,67,96' 456 567 67 96 DEF

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

 Site       UserId
   ABC           '456,567,67,96'
   DEF           '67,987'
 
新的数据帧应如下所示:

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  
在每列旁边还有一个空列,用于将数字与名称映射。 使用者

因此,最终的数据帧是:

  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
用于新的
数据帧

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

通过将
MultiIndex
by中的列的更改顺序连接在一起,最后用
f-string
s展平列表理解中的
MultiIndex
,并通过以下方式添加列
df1[[['UserID']

如有必要,将
None/NaN
s替换为空字符串:


该解决方案工作正常,但是原始文件中有许多列(站点等)以及用户ID。因此,最终的数据帧也应该包括这些列。@haristhedy-Change
df=df1[['UserId']]。join(df)
to
df=df1。join(df)
Hi@jezrael我也想添加电话号码列..但代码返回了一个错误df3=df.stack(dropna=False).map(s).unstack()…没有重复的电话号码,但返回了错误“仅对唯一值的索引对象重新索引有效”@haristhedy-你能发布新问题吗?
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'] = 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
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  
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