Pandas:仅在数据帧的开头和结尾删除 NaN
Pandas: Remove NaN only at beginning and end of dataframe
我有一个 pandas DataFrame,看起来像这样:
sum
1948 NaN
1949 NaN
1950 5
1951 3
1952 NaN
1953 4
1954 8
1955 NaN
并且我只想在开始和结束时切断 NaN
s(即只保留 1950 年到 1954 年的值,包括 NaN
)。
我已经尝试了 .isnull()
和 dropna()
,但不知何故我找不到合适的解决方案。
有人可以帮忙吗?
这是一种方法。
import pandas as pd
# your data
# ==============================
df
sum
1948 NaN
1949 NaN
1950 5
1951 3
1952 NaN
1953 4
1954 8
1955 NaN
# processing
# ===============================
idx = df.fillna(method='ffill').dropna().index
res_idx = df.loc[idx].fillna(method='bfill').dropna().index
df.loc[res_idx]
sum
1950 5
1951 3
1952 NaN
1953 4
1954 8
使用内置的 first_valid_index
and last_valid_index
它们是专门为此设计的并切片你的 df:
In [5]:
first_idx = df.first_valid_index()
last_idx = df.last_valid_index()
print(first_idx, last_idx)
df.loc[first_idx:last_idx]
1950 1954
Out[5]:
sum
1950 5
1951 3
1952 NaN
1953 4
1954 8
这是一个 Numpy
的方法:
import numpy as np
x = np.logical_not(pd.isnull(df))
mask = np.logical_and(np.cumsum(x)!=0, np.cumsum(x[::-1])[::-1]!=0)
In [313]: df.loc[mask['sum'].tolist()]
Out[313]:
sum
1950 5
1951 3
1952 NaN
1953 4
1954 8
我有一个 pandas DataFrame,看起来像这样:
sum
1948 NaN
1949 NaN
1950 5
1951 3
1952 NaN
1953 4
1954 8
1955 NaN
并且我只想在开始和结束时切断 NaN
s(即只保留 1950 年到 1954 年的值,包括 NaN
)。
我已经尝试了 .isnull()
和 dropna()
,但不知何故我找不到合适的解决方案。
有人可以帮忙吗?
这是一种方法。
import pandas as pd
# your data
# ==============================
df
sum
1948 NaN
1949 NaN
1950 5
1951 3
1952 NaN
1953 4
1954 8
1955 NaN
# processing
# ===============================
idx = df.fillna(method='ffill').dropna().index
res_idx = df.loc[idx].fillna(method='bfill').dropna().index
df.loc[res_idx]
sum
1950 5
1951 3
1952 NaN
1953 4
1954 8
使用内置的 first_valid_index
and last_valid_index
它们是专门为此设计的并切片你的 df:
In [5]:
first_idx = df.first_valid_index()
last_idx = df.last_valid_index()
print(first_idx, last_idx)
df.loc[first_idx:last_idx]
1950 1954
Out[5]:
sum
1950 5
1951 3
1952 NaN
1953 4
1954 8
这是一个 Numpy
的方法:
import numpy as np
x = np.logical_not(pd.isnull(df))
mask = np.logical_and(np.cumsum(x)!=0, np.cumsum(x[::-1])[::-1]!=0)
In [313]: df.loc[mask['sum'].tolist()]
Out[313]:
sum
1950 5
1951 3
1952 NaN
1953 4
1954 8