我正在使用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中,然后通过索引调用。