为了账号安全,请及时绑定邮箱和手机立即绑定

根据列中的值删除行中的值,然后在 Pandas 中将单元格拆分为多行

根据列中的值删除行中的值,然后在 Pandas 中将单元格拆分为多行

哈士奇WWW 2021-09-01 14:48:02
当系统出现在“类型”列中时,我想删除该行中的所有值,“名称”列中的值除外。当硬件出现在“类型”列中时,我想删除该行中除“颜色”列中的值之外的所有值。之后,我想将“文本”列中非空的所有单元格拆分为多行,并保留该列中为空的行。这是我拥有的数据框:df  Type        Text                             Name        ID        Color  System      aca\nmaca\nstream\nphase\n       Gary        123       Red  System      aca\nmaca\nstream\nphase\n       Mary        3254      Yellow  Hardware    a\nmaca\nstream\nphase\n         Jerry       158       White  Software    ca\nmaca\nstream\nphase\n        Perry       56414     Green  Software    aca\nmac\nstream\nphase\n        Jimmy       548       Blue  System      aca\nmaca\nstream\nphase\n       Marc        5658      Black  System      aca\nmaca\nstram\npha\n          John        867       Pink  Hardware    aca\nma\nstream\nphase\n         Sam         665       Gray  Hardware    aca\nmaca\nstream\nphase\n       Jury        5784      Azure  System      aca\nmaca\nstream\nphase\n       Larry       5589      Fawn  Software    aca\nmaca\nst\nphase\n           James       6568      Magenta  System      aca\nmaca\nstream\nph\n          Kevin       568       Cyan这是所需的结果:  Type        Text                             Name        ID        Color  System                                       Gary          System                                       Mary          Hardware                                                           White  Software    ca                               Perry       56414     Green  Software    maca                             Perry       56414     Green  Software    stream                           Perry       56414     Green  Software    phase                            Perry       56414     Green对于将单元格拆分为多行,我尝试了此功能:  def SepInRows(df, c):      s = df[c].str.split('\n', expand=True).stack()      i = s.index.get_level_values(0)      df2 = df.loc[i].copy()      df2[c] = s.values      return df2  但它会在“文本”列中删除具有空值的行,这不是我想要的。如何解决这个问题?
查看完整描述

1 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

您可以在预处理中使用maskwith difference,然后使用此解决方案:


c1 = df.columns.difference(['Type','Name'])

c2 = df.columns.difference(['Type','Color'])


df[c1] = df[c1].mask(df['Type'] == 'System', np.nan)

df[c2] = df[c2].mask(df['Type'] == 'Hardware', np.nan)

cols = df.columns

df1 = (df.join(df.pop('Text').str.split('\n', expand=True)

              .stack()

              .reset_index(level=1, drop=True)

              .rename('Text'))

              ).reset_index(drop=True).reindex(columns=cols)


print (df1)

        Type    Text   Name       ID    Color

0     System     NaN   Gary      NaN      NaN

1     System     NaN   Mary      NaN      NaN

2   Hardware     NaN    NaN      NaN    White

3   Software      ca  Perry  56414.0    Green

4   Software    maca  Perry  56414.0    Green

5   Software  stream  Perry  56414.0    Green

6   Software   phase  Perry  56414.0    Green

7   Software          Perry  56414.0    Green

8   Software     aca  Jimmy    548.0     Blue

9   Software     mac  Jimmy    548.0     Blue

10  Software  stream  Jimmy    548.0     Blue

11  Software   phase  Jimmy    548.0     Blue

12  Software          Jimmy    548.0     Blue

13    System     NaN   Marc      NaN      NaN

14    System     NaN   John      NaN      NaN

15  Hardware     NaN    NaN      NaN     Gray

16  Hardware     NaN    NaN      NaN    Azure

17    System     NaN  Larry      NaN      NaN

18  Software     aca  James   6568.0  Magenta

19  Software    maca  James   6568.0  Magenta

20  Software      st  James   6568.0  Magenta

21  Software   phase  James   6568.0  Magenta

22  Software          James   6568.0  Magenta

23    System     NaN  Kevin      NaN      NaN


查看完整回答
反对 回复 2021-09-01
  • 1 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信