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)
todf=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