根据值不起作用选择Pandas中的行

时间:2018-05-18 13:40:23

标签: python pandas numpy dataframe nan

我有数据框df_test.head()

0           0      20.570           17.77       132.90       1326.0   
1           0      19.690           21.25       130.00       1203.0   
2           0      11.420           20.38        77.58        386.1   
3           1      20.290           14.34       135.10       1297.0  

我需要选择value=0

的行

我做了以下事情:

MT=df_test.diagnosis==0

MT.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 568 entries, 0 to 567
Data columns (total 1 columns):
(diagnosis,)    568 non-null bool
dtypes: bool(1)
memory usage: 648.0 bytes
MT.head()

    dia
0   True
1   True
2   True
3   True
4   True

但是当我尝试根据MT选择行时,它提供以下内容:

df_test[MT]


0   0.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     ...     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
1   0.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     ...     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
2   0.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     ...     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
3   0.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     ...     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
4   0.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     ...     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
5   0.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     ...     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
6   0.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     ...     NaN     NaN     

所以它把所有东西都当作NAN。

任何帮助?

1 个答案:

答案 0 :(得分:0)

您在构建MT或实际上df_test.diagnosis的方式方面存在一个问题。

通常,当您拥有DataFrame并且应用某些逻辑时,您将返回pandas.Series。例如:

import pandas as pd
df = pd.DataFrame({'user_id': [1, 2, 3, 4, 5, 6, 7],
                   'val': [11, 22, 33, 44, 55, 66, 77]})

MT = df.user_id == 1
type(MT)
#pandas.core.series.Series

但是,在您的情况下,您正在做一些使其成为DataFrame的内容当您使用DataFrame[]进行切片时,行为会根据您发送的内容而有很大差异。如果你发送一个布尔值Series,那么它会返回SeriesTrue

的行的所有列
df[MT]
#   user_id  val
#0        1   11

但是,如果您在DataFrame内传递[],那么它会屏蔽DataFrame仅返回掩码为True的列中的值并替换其他所有内容与NaN

MT_df = MT.to_frame()
type(MT_df)
#pandas.core.frame.DataFrame

df[MT_df]
#   user_id  val
#0      1.0  NaN
#1      NaN  NaN
#2      NaN  NaN
#3      NaN  NaN
#4      NaN  NaN
#5      NaN  NaN
#6      NaN  NaN

MT_df没有列val,因此所有条目都变为NaNTrue内只有1 user_id个值,因此会传递该值。其余部分被掩盖为NaN

最终,您需要找出导致MT成为DataFrame的原因,但草率的修复将是df[MT.values]