根据顺序和NaN删除pandas数据框中的行



我正在使用pandas导入一个数据框,并且希望在分组信息之前删除某些行。

我如何从以下(示例):

Name1   Name2   Name3
0   A1  B1  1
1   NaN NaN 2
2   NaN NaN 3
3   NaN B2  4
4   NaN NaN 5   
5   NaN NaN 6
6   NaN B3  7
7   NaN NaN 8
8   NaN NaN 9
9   A2  B4  1
10  NaN NaN 2
11  NaN NaN 3
12  NaN B5  4
13  NaN NaN 5
14  NaN NaN 6
15  NaN B6  7
16  NaN NaN 8
17  NaN NaN 9

:

Name1   Name2   Name3
0   A1  B1  1
3   NaN B2  4
6   NaN B3  7
8   NaN NaN 9
9   A2  B4  1
12  NaN B5  4
15  NaN B6  7
17  NaN NaN 9

(我的实际案例由几千行组成,结构与示例相同)

我已经尝试删除行与NaN在Name2使用df=df[df['Name2'].notna()],但后来我得到这个:

Name1   Name2   Name3
0   A1  B1  1
3   NaN B2  4
6   NaN B3  7
9   A2  B4  1
12  NaN B5  4
15  NaN B6  7

我还需要在上面的例子中保留第8行和第17行。

假设您想要保留以下行:

  • Name2">
  • 或非na "Name1"或数据结束

可以使用布尔索引:

# is the row not-NA in Name2?
m1 = df['Name2'].notna()
# is is the last row of a group?
m2 = df['Name1'].notna().shift(-1, fill_value=True)
# keep if either of the above condition is True
out = df[m1|m2]

输出:

Name1 Name2  Name3
0     A1    B1      1
3    NaN    B2      4
6    NaN    B3      7
8    NaN   NaN      9
9     A2    B4      1
12   NaN    B5      4
15   NaN    B6      7
17   NaN   NaN      9

中间体:

Name1 Name2  Name3     m1     m2  m1|m2
0     A1    B1      1   True  False   True
1    NaN   NaN      2  False  False  False
2    NaN   NaN      3  False  False  False
3    NaN    B2      4   True  False   True
4    NaN   NaN      5  False  False  False
5    NaN   NaN      6  False  False  False
6    NaN    B3      7   True  False   True
7    NaN   NaN      8  False  False  False
8    NaN   NaN      9  False   True   True
9     A2    B4      1   True  False   True
10   NaN   NaN      2  False  False  False
11   NaN   NaN      3  False  False  False
12   NaN    B5      4   True  False   True
13   NaN   NaN      5  False  False  False
14   NaN   NaN      6  False  False  False
15   NaN    B6      7   True  False   True
16   NaN   NaN      8  False  False  False
17   NaN   NaN      9  False   True   True

您可以在df.dropna中使用thresh参数。

# toy data
data = {'name1': [np.nan, np.nan, np.nan, np.nan], 'name2': [np.nan, 1, 2, np.nan], 'name3': [1, 2, 3, 4]}
df = pd.DataFrame(data)
name1  name2  name3
0    NaN    NaN      1
1    NaN    1.0      2
2    NaN    2.0      3
3    NaN    NaN      4

要删除带有2+ NaN的行,只需这样做:

df.dropna(thresh = 2)
name1  name2  name3
1    NaN    1.0      2
2    NaN    2.0      3

如果您想保留第8行和第17行,您可能希望首先将它们分别保存在另一个变量中,然后使用df.append将它们添加到df中,然后通过索引调用。

最新更新