【问题标题】:merge two rows in one row and convert to NA将两行合并为一行并转换为 NA
【发布时间】:2020-11-21 20:16:18
【问题描述】:
   Dataframe:
     0     1    2   3     4      slicing
0   NaN  Object  1  NaN  NaN        0
6   NaN  Object  2  NaN  NaN        6
12  NaN  Object  3  NaN  NaN       12
18  NaN  Object  4  NaN  NaN       18
23  NaN  Object  5  NaN  NaN       23
   desired output:
    0     1       2   3     4     slicing
0   NaN  Object1  NaN  NaN  NaN        0
6   NaN  Object2  NaN  NaN  NaN        6
12  NaN  Object3  NaN  NaN  NaN       12
18  NaN  Object4  NaN  NaN  NaN       18
23  NaN  Object5  NAN  NaN  NaN       23
  • 图书馆熊猫
  • 遍历数据集中的每一行(因为只有 NA 和 str'Object' 及其对应的 str'1-10' 编号)
  • 用 Na 替换 str 数字并将同一行中的数据连接起来

现在的代码:

df=df[df.apply(lambda row: row.astype(str).str.contains('Desk').any().df[row]+df[row],axis=1)]

Index      0      1   2    3    4
0         NaN  Desk   1  NaN  NaN
5         NaN  Desk   2  NaN  NaN
10        NaN  Desk   3  NaN  NaN
15        NaN  Desk   4  NaN  NaN
20        NaN  Desk   5  NaN  NaN

【问题讨论】:

    标签: python pandas dataframe nan


    【解决方案1】:

    这就是我所做的:

    以如下数据框为例:

           0     1       2   3    4     slicing
    index                       
    0      NaN   Object  1   NaN  NaN   0
    6      NaN   Object  2   NaN  A     6
    12     NaN   Object  3   NaN  NaN   12
    18     NaN   NaN     4   NaN  NaN   18
    23     Stuff Object  NaN 5    NaN   23
    

    当第 1 列中存在“对象”时,我在以下 4 行代码中执行 4 个步骤: 1) 将 nans 替换为空; 2)将所有内容设置为字符串类型; 3)加入行,到第1列,4)用nan替换所有其他列

    df.loc[df['1']=='Object',['0', '2', '3','4']] = df.loc[df['1']=='Object',['0', '2', '3','4']].fillna('')
    df.loc[df['1']=='Object',['0','1', '2', '3','4']] = df.loc[df['1']=='Object',['0','1', '2', '3','4']].astype(str)
    df.loc[df['1']=='Object', ['1','0', '2', '3','4']] = df.loc[df['1']=='Object', ['1', '0', '2', '3','4']].agg(''.join, axis=1)
    df.loc[df['1'].str.contains('Object', na = False), ['0', '2', '3','4']] = np.nan
    df
    
           0    1             2    3     4   slicing
    index                       
    0      NaN  Object1       NaN  NaN  NaN  0
    6      NaN  Object2A      NaN  NaN  NaN  6
    12     NaN  Object3       NaN  NaN  NaN  12
    18     NaN  NaN           4    NaN  NaN  18
    23     NaN  ObjectStuff5  NaN  NaN  NaN  23
    

    【讨论】:

    • 有没有办法遍历行而不是指定列,因为数字的位置可能会有所不同或将根据数据框而有所不同?
    • 基本上,我需要一种类似的方法,但仅适用于遇到“Desk”的行,因为第二列 (2) 中有更多数据不需要连接
    • 原始示例中的“Desk”是指“Object”,对吗?另外,当它找到“Desk”时,是否可以与第 2 列连接?
    • 感谢您的回答。是的,我的意思是“对象”对不起。不,我想与“对象”在同一行中的任何内容连接,而不是通过列
    【解决方案2】:

    如果我了解您要实现的目标,您应该真正尝试使用列而不是迭代。它要快得多。你可以试试这样的:

    import numpy as np
    columns = df.columns.tolist()
    ix = df[df[columns[1]].str.contains('Object')].index
    df.loc[ix:columns[1]] = df.loc[ix:columns[1]]+df.loc[ix:columns[2]]
    df.loc[ix:columns[2]] = np.nan
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-08
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      相关资源
      最近更新 更多