将空行移到数据框的底部

时间:2019-04-10 11:52:31

标签: python python-3.x pandas numpy dataframe

我有一个数据框:

df1 = pd.DataFrame({'a': [1, 2, 10, np.nan, 5, 6, np.nan, 8],
                   'b': list('abcdefgh')})
df1

     a      b
0   1.0     a
1   2.0     b
2   10.0    c
3   NaN     d
4   5.0     e
5   6.0     f
6   NaN     g
7   8.0     h

我想将a为np.nan的所有行移动到数据框的底部

df2 = pd.DataFrame({'a': [1, 2, 10, 5, 6, 8, np.nan,  np.nan],
                   'b': list('abcefhdg')})
df2

     a      b
0   1.0     a
1   2.0     b
2   10.0    c
3   5.0     e
4   6.0     f
5   8.0     h
6   NaN     d
7   NaN     g

我已经尝试过了:

na = df1[df1.a.isnull()]
df1.dropna(subset = ['a'], inplace=True)
df1 = df1.append(na)
df1

是否有一种更清洁的方法?还是有我可以使用的功能?

2 个答案:

答案 0 :(得分:3)

编辑OP后的新答案

您已经很接近了,但是可以通过使用以下代码来清理代码:

df1 = pd.concat([df1[df1['a'].notnull()], df1[df1['a'].isnull()]], ignore_index=True)

print(df1)
      a  b
0   1.0  a
1   2.0  b
2  10.0  c
3   5.0  e
4   6.0  f
5   8.0  h
6   NaN  d
7   NaN  g

旧答案
sort_valuesna_position=last参数一起使用:

df1 = df1.sort_values('a', na_position='last')

print(df1)
     a  b
0  1.0  a
1  2.0  b
2  3.0  c
4  5.0  e
5  6.0  f
7  8.0  h
3  NaN  d
6  NaN  g

答案 1 :(得分:2)

pandas中尚不存在,请对Series.isnaSeries.argsort使用DataFrame.iloc并按DataFrame.sort_values更改顺序:

df1 = df1.iloc[df1['a'].isna().argsort()].reset_index(drop=True)
print (df1)
      a  b
0   1.0  a
1   2.0  b
2  10.0  c
3   5.0  e
4   6.0  f
5   8.0  h
6   NaN  d
7   NaN  g

或者带有辅助列和https://developer.apple.com/documentation/pushkit的纯熊猫解决方案:

df1 = (df1.assign(tmp=df1['a'].isna())
          .sort_values('tmp')
          .drop('tmp', axis=1)
          .reset_index(drop=True))
print (df1)
      a  b
0   1.0  a
1   2.0  b
2  10.0  c
3   5.0  e
4   6.0  f
5   8.0  h
6   NaN  d
7   NaN  g