Python 将两行合并为一行并转换为NA 图书馆熊猫 遍历数据集中的每一行(因为只有NA和str'Object'及其对应的str'1-10'编号) 将str编号替换为Na并连接同一行中的数据

Python 将两行合并为一行并转换为NA 图书馆熊猫 遍历数据集中的每一行(因为只有NA和str'Object'及其对应的str'1-10'编号) 将str编号替换为Na并连接同一行中的数据,python,pandas,dataframe,nan,Python,Pandas,Dataframe,Nan,目前的代码: 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

目前的代码:

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
当第1列中存在“Object”时,我在下面4行代码中执行4个步骤:1)将nans替换为空;2) 将所有内容设置为字符串类型;3) 将行连接到第1列,4)将所有其他列替换为nan

       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

如果我理解您想要实现的目标,那么您应该真正尝试使用列而不是迭代。它要快得多。您可以尝试以下方法:

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列?谢谢你的回答。是的,我是说“物体”对不起。不,我想与“Object”在同一行中的任何内容连接,而不是通过列连接
       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
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
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