如何在不丢失整行的情况下从df中删除nan?

时间:2020-02-17 11:12:58

标签: python python-3.x pandas

今天,如何在不丢失整行的情况下删除nan值? 这就是我的df的样子。

enter image description here

我尝试了pandasdf = schule.dropna(),但这删除了行中的所有内容。

但是我必须保留这些值,因为最后我希望它们向上移动。

enter image description here

3 个答案:

答案 0 :(得分:3)

可能会有所帮助。你可以尝试一下 !!!! enter image description here

答案 1 :(得分:1)

根据您的问题陈述,您希望将nan值的优先级降低,并将非nan值置于顶部。

import numpy as np
import pandas as pd
import functools

def drop_and_roll(col, na_position='last', fillvalue=np.nan):
    result = np.full(len(col), fillvalue, dtype=col.dtype)
    mask = col.notnull()
    N = mask.sum()
    if na_position == 'last':
        result[:N] = col.loc[mask]
    elif na_position == 'first':
        result[-N:] = col.loc[mask]
    else:
        raise ValueError('na_position {!r} unrecognized'.format(na_position))
    return result

df = pd.read_table('data', sep='\s{2,}')

print(df.apply(functools.partial(drop_and_roll, fillvalue='')))

答案 2 :(得分:0)

假设您要回填值,然后删除出现在此示例中任何列中的所有重复项,

import pandas as pd
import numpy as np

data = [
    ['POINT_1.1', 'POINT_1.2', pd.NA],
    [pd.NA, pd.NA, 'POINT_1.3'],
    ['POINT_2.1', 'POINT_2.2', pd.NA],
    [pd.NA, pd.NA, 'POINT_2.3']

]

df = pd.DataFrame(data)
df

#            0          1          2
# 0  POINT_1.1  POINT_1.2       <NA>
# 1       <NA>       <NA>  POINT_1.3
# 2  POINT_2.1  POINT_2.2       <NA>
# 3       <NA>       <NA>  POINT_2.3

t = df.T.bfill().T.bfill()
t

#            0          1          2
# 0  POINT_1.1  POINT_1.2  POINT_1.3
# 2  POINT_2.1  POINT_2.2  POINT_2.3

for column in t.columns:
    t = t.drop_duplicates(column)
t

#            0          1          2
# 0  POINT_1.1  POINT_1.2  POINT_1.3
# 2  POINT_2.1  POINT_2.2  POINT_2.3