pandas 根据顺序和NaN删除panda Dataframe 中的行

jxct1oxe  于 2022-11-27  发布在  其他
关注(0)|答案(2)|浏览(190)

我正在使用panda导入 Dataframe ,并希望在对信息进行分组之前删除某些行。
我如何从以下(示例):

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

(My实际情况由数千行组成,具有与示例相同的结构)
我尝试过使用df=df[df['Name2'].notna()]删除Name2中包含NaN的行,但得到的结果如下:

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行。

fruv7luv

fruv7luv1#

假设您要保留以下行:

  • “名称2”列中不是NA
  • 或非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
sz81bmfz

sz81bmfz2#

您可以在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中,然后按索引重新排序。

相关问题