猿问

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

当系统出现在“类型”列中时,我想删除该行中的所有值,“名称”列中的值除外。当硬件出现在“类型”列中时,我想删除该行中除“颜色”列中的值之外的所有值。之后,我想将“文本”列中非空的所有单元格拆分为多行,并保留该列中为空的行。


这是我拥有的数据框:


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  

但它会在“文本”列中删除具有空值的行,这不是我想要的。


如何解决这个问题?


哈士奇WWW
浏览 193回答 1
1回答

慕码人8056858

您可以在预处理中使用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.columnsdf1 = (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    Color0     System     NaN   Gary      NaN      NaN1     System     NaN   Mary      NaN      NaN2   Hardware     NaN    NaN      NaN    White3   Software      ca  Perry  56414.0    Green4   Software    maca  Perry  56414.0    Green5   Software  stream  Perry  56414.0    Green6   Software   phase  Perry  56414.0    Green7   Software          Perry  56414.0    Green8   Software     aca  Jimmy    548.0     Blue9   Software     mac  Jimmy    548.0     Blue10  Software  stream  Jimmy    548.0     Blue11  Software   phase  Jimmy    548.0     Blue12  Software          Jimmy    548.0     Blue13    System     NaN   Marc      NaN      NaN14    System     NaN   John      NaN      NaN15  Hardware     NaN    NaN      NaN     Gray16  Hardware     NaN    NaN      NaN    Azure17    System     NaN  Larry      NaN      NaN18  Software     aca  James   6568.0  Magenta19  Software    maca  James   6568.0  Magenta20  Software      st  James   6568.0  Magenta21  Software   phase  James   6568.0  Magenta22  Software          James   6568.0  Magenta23    System     NaN  Kevin      NaN      NaN
随时随地看视频慕课网APP

相关分类

Python
我要回答