分隔一行

2024-03-29 13:19:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张这样的桌子:

username     email                name         phone1     phone2
 1920      abc@gmail.com       TSteve/Nancy       a          b

我希望这是:

username     email            first_name     last_name    phone1     phone2
 1920      abc@gmail.com        Steve            T          a   
 1920-2                         Nancy            T                     b

此表为csv格式。你知道吗

总结:

1)将“name”列拆分为“first\u name”和“last\u name”,并将takeout和本例中的第一个字母“T”移动到“last\u name”,并用两个名称“Steve”和“Nancy”分隔该行。Steve/Nancy将根据“/”进行拆分并删除斜杠。你知道吗

2)电话1保留,但电话2将移至下一行。(稍后我将合并电话1和电话2)

3)第二行的新用户名将与末尾的“-2”相同。你知道吗

我花了三天时间尝试了几件事,但都失败了。如果你们能指导我完成这些步骤,对我的学习和学习会很有帮助。你知道吗

谢谢


Tags: namecomemailusernamegmailstevefirstlast
1条回答
网友
1楼 · 发布于 2024-03-29 13:19:11

我想你需要:

#get all columns without name
cols = df.columns.difference(['name']).tolist()
#create MultiIndex and split, reshape by stack
df = (df.set_index(cols)['name']
        .str.split('/',expand=True)
        .stack()
        .reset_index(name='first_name'))
#boolen mask for select only first or last new rows
m = df['level_4'].eq(0)
#remove column level_4
df = df.drop('level_4', axis=1)
#add last name for select first letter by condition, replace NaNs by forward fill
df['last_name'] = df['first_name'].str[0].where(m).ffill()
#get all letter without first
df['first_name'] = df['first_name'].mask(m, df['first_name'].str[1:])
#remove first all last values
df['email'] = df['email'].where(m, '')
df['phone1'] = df['phone1'].where(m, '')
df['phone2'] = df['phone2'].mask(m, '')
#add -2 for second rows
df['username'] = df['username'].where(m, df['username'].astype(str) + '-2')
print (df)
            email phone1 phone2 username first_name last_name
0   abc@gmail.com      a            1920      Steve         T
1                             b   1920-2      Nancy         T
2  abcd@gmail.com      a            1921      Steve         K
3                             b   1921-2      Nancy         K

相关问题 更多 >