【问题标题】:separating a row python pandas分隔一行 python pandas
【发布时间】:2018-01-25 05:42:11
【问题描述】:

我有一张这样的桌子:

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_name”和“last_name”并取出并将本例中的第一个字母“T”移动到“last_name”,并将具有两个名称“Steve”和“Nancy”的行分开. Steve/Nancy 将根据“/”进行拆分并删除斜线。

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

3) 第二行的新用户名将是相同的数字,末尾带有“-2”。

我花了 3 天时间尝试了几件事,但都失败了。如果你们能指导我完成这些步骤,对我学习和学习将非常有帮助。

谢谢

【问题讨论】:

标签: python pandas csv split row


【解决方案1】:

我认为你需要:

#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

【讨论】:

  • 谢谢,可以去掉名字前面的T和K吗?
  • 哎呀,我忘了。
  • 在创建多索引拆分部分时出现“NotImplementedError: > 1 ndim Categorical are not supported at this time”错误。
  • 看来你的名字是分类的。所以尝试第一步df['name'] = df['name'].astype(str)。如果它不起作用,请检查 print(df.dtypes) 并且所有分类列都转换为字符串。如果还有问题,请告诉我。谢谢。
  • 感谢您的帮助。我尝试了你的建议,但我仍然遇到同样的问题
猜你喜欢
  • 2021-05-21
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多