pandas 从DataFrame的特定列中选择非空行,并对其他列进行子选择

xe55xuns  于 2023-02-17  发布在  其他
关注(0)|答案(3)|浏览(267)

我有一个 Dataframe ,它有几列,所以我选择了其中的一些列来创建这样的变量。

xtrain = df[['Age', 'Fare', 'Group_Size', 'deck', 'Pclass', 'Title']]

我想从这些列中删除主 Dataframe 中Survive列为nan的所有行。

b5lpy0ml

b5lpy0ml1#

您可以根据'Survive'列的notnull()将布尔掩码传递给df,并选择感兴趣的列:

In [2]:
# make some data
df = pd.DataFrame(np.random.randn(5,7), columns= ['Survive', 'Age','Fare', 'Group_Size','deck', 'Pclass', 'Title' ])
df['Survive'].iloc[2] = np.NaN
df
Out[2]:
    Survive       Age      Fare  Group_Size      deck    Pclass     Title
0  1.174206 -0.056846  0.454437    0.496695  1.401509 -2.078731 -1.024832
1  0.036843  1.060134  0.770625   -0.114912  0.118991 -0.317909  0.061022
2       NaN -0.132394 -0.236904   -0.324087  0.570660  0.758084 -0.176421
3 -2.145934 -0.020003 -0.777785    0.835467  1.498284 -1.371325  0.661991
4 -0.197144 -0.089806 -0.706548    1.621260  1.754292  0.725897  0.860482

现在将掩码传递给loc,以仅获取非NaN行:

In [3]:
xtrain = df.loc[df['Survive'].notnull(), ['Age','Fare', 'Group_Size','deck', 'Pclass', 'Title' ]]
xtrain

Out[3]:
        Age      Fare  Group_Size      deck    Pclass     Title
0 -0.056846  0.454437    0.496695  1.401509 -2.078731 -1.024832
1  1.060134  0.770625   -0.114912  0.118991 -0.317909  0.061022
3 -0.020003 -0.777785    0.835467  1.498284 -1.371325  0.661991
4 -0.089806 -0.706548    1.621260  1.754292  0.725897  0.860482
tyg4sfes

tyg4sfes2#

两个选择,因为...为什么不呢?
两者都在列切片之前丢弃nan,这是两个调用,而不是EdChum的一个调用。

一个

df.dropna(subset=['Survive'])[
    ['Age','Fare', 'Group_Size','deck', 'Pclass', 'Title' ]]

两个

df.query('Survive == Survive')[
    ['Age','Fare', 'Group_Size','deck', 'Pclass', 'Title' ]]
uidvcgyl

uidvcgyl3#

如果将列的子集分配给变量和筛选器,则可能更易于阅读。

notna_msk = df['Survive'].notna()
cols = ['Age', 'Fare', 'Group_Size', 'deck', 'Pclass', 'Title', 'Survive']
new_df = df.loc[notna_msk, cols]

此外,如果您已经在OP中从df创建了xtrain,那么您仍然可以使用掩码过滤此 Dataframe ,即使它没有Survive列;只要索引就足够了。

new_df = xtrain.loc[df['Survive'].notna()]

相关问题