Pandas 去掉NaN值并重新排列列的顺序

Pandas 去掉NaN值并重新排列列的顺序,pandas,dataframe,nan,Pandas,Dataframe,Nan,我制作了一个您可以运行的特别示例,向您展示了一个类似于我必须使用的df3的数据帧: people1 = [['Alex',10],['Bob',12],['Clarke',13],['NaN',],['NaN',],['NaN',]] people2 = [['NaN',],['NaN',],['NaN',],['Mark',20],['Jane',22],['Jack',23]] df1 = pd.DataFrame(people1,columns=['Name','Age']) df2 =

我制作了一个您可以运行的特别示例,向您展示了一个类似于我必须使用的df3的数据帧:

people1 = [['Alex',10],['Bob',12],['Clarke',13],['NaN',],['NaN',],['NaN',]]
people2 = [['NaN',],['NaN',],['NaN',],['Mark',20],['Jane',22],['Jack',23]]
df1 = pd.DataFrame(people1,columns=['Name','Age'])
df2 = pd.DataFrame(people2,columns=['Name','Age'])

people_list=[df1, df2]

df3 = pd.concat((people_list[0]['Name'], people_list[1]['Name']), axis=1)
df3

如何修改数据帧df3以去除NaN值并将两列相邻放置(我不在乎保留id,我只想要一个两列相邻的干净数据帧)?

您可以先删除NaN值:

df3 = pd.concat([df1.dropna(), df2.dropna()])
输出:

    Name   Age
0    Alex  10.0
1     Bob  12.0
2  Clarke  13.0
3    Mark  20.0
4    Jane  22.0
5    Jack  23.0
    Name  Name
0    Alex  Mark
1     Bob  Jane
2  Clarke  Jack
或者,如果您想并排联系:

df3 = pd.concat([df1.dropna().reset_index(drop=True), df2.dropna().reset_index(drop=True)], 1)
df3 = pd.concat([df1.dropna().reset_index(drop=True)['Name'], df2.dropna().reset_index(drop=True)['Name']], 1)
输出:

     Name   Age  Name   Age
0    Alex  10.0  Mark  20.0
1     Bob  12.0  Jane  22.0
2  Clarke  13.0  Jack  23.0
    Name  Name
0    Alex  Mark
1     Bob  Jane
2  Clarke  Jack
如果您只想并排查看
名称
列:

df3 = pd.concat([df1.dropna().reset_index(drop=True), df2.dropna().reset_index(drop=True)], 1)
df3 = pd.concat([df1.dropna().reset_index(drop=True)['Name'], df2.dropna().reset_index(drop=True)['Name']], 1)
输出:

     Name   Age  Name   Age
0    Alex  10.0  Mark  20.0
1     Bob  12.0  Jane  22.0
2  Clarke  13.0  Jack  23.0
    Name  Name
0    Alex  Mark
1     Bob  Jane
2  Clarke  Jack
如果只想修改df3,可以通过
iloc
dropna
完成:

df3 = pd.concat([df3.iloc[:,0].dropna().reset_index(drop=True) , df3.iloc[:,1].dropna().reset_index(drop=True)],1)
输出:

    Name   Age
0    Alex  10.0
1     Bob  12.0
2  Clarke  13.0
3    Mark  20.0
4    Jane  22.0
5    Jack  23.0
    Name  Name
0    Alex  Mark
1     Bob  Jane
2  Clarke  Jack

如果我正确理解了你的意思,这是一个可能的解决办法

people1 = [['Alex',10],['Bob',12],['Clarke',13],['NaN',],['NaN',],['NaN',]]
people2 = [['NaN',],['NaN',],['NaN',],['Mark',20],['Jane',22],['Jack',23]]
df1 = pd.DataFrame(people1,columns=['Name1','Age']).dropna()
df2 = pd.DataFrame(people2,columns=['Name2','Age']).dropna().reset_index()

people_list=[df1, df2]

df3 = pd.concat((people_list[0]['Name1'], people_list[1]['Name2']), axis=1)
print(df3)

   Name1    Name2
0   Alex    Mark
1   Bob     Jane
2   Clarke  Jack
如果您已经拥有该数据帧:

count = df3.Name2.isna().sum()
df3.loc[:, 'Name2'] = df3.Name2.shift(-count)
df3 = df3.dropna()
print(df3)

    Name1   Name2
0   Alex    Mark
1   Bob     Jane
2   Clarke  Jack

这将帮助您连接两个df

我的意思是您已经拥有了df3!(在代码中,我不得不构建一个假的示例,以获得一个与我所面临的示例类似的数据帧)。因此,您不能修改构建它的方式,因为它已经是这样了@GiacomoF更新了答案忘了代码,我只是为了得到df3才编出来的。假设您得到了一个类似fd3的数据帧,您必须修改它以获得一个没有NaN值的数据帧,并且两列相邻。你会怎么做?答案的第二部分是关于这个。对!谢谢