今天,如何在不丢失整行的情况下删除nan值?
这就是我的df
的样子。
我尝试了pandasdf = schule.dropna()
,但这删除了行中的所有内容。
但是我必须保留这些值,因为最后我希望它们向上移动。
答案 0 :(得分:3)
答案 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