|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
hi,小鱼c您好,下面是我练习插入的DataFrame来进行布尔索引:
- import pandas as pd
- import numpy as np
- np.random.seed(0)
- _iterator = zip(["id", "name", "score", "age"],
- [[i for i in range(1, 8)],
- ["bob", "fishc", "allen", "xiaoming", "xiaobai", "xiaoma", "xiaoli"],
- [i for i in np.random.randint(50, 101, 7)],
- [i for i in np.random.randint(25, 35, 7)]
- ])
- df = pd.DataFrame({k: v for k, v in _iterator}, index=np.arange(1, 8, 1))
复制代码
- 方式1:
- print(df['score']>70)
- print(type(df['score']>70))
- print(type(df['score']))
- print(type(df))
- print(df[df['score']>70])
- print(df['score'][df['score']>70])
- print("\n------两种方式进行比较-------\n")
- 方式2:
- print(df[['score']]>70)
- print(type(df[['score']]>70))
- print(type(df[['score']]))
- print(type(df))
- print(df[df[['score']]>70])
- print(df[['score']][df[['score']]>70])
复制代码
返回结果如下:
1 True
2 True
3 False
4 False
5 False
6 True
7 False
Name: score, dtype: bool
<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
<class 'pandas.core.frame.DataFrame'>
id name score age
1 1 bob 94 28
2 2 fishc 97 30
6 6 xiaoma 89 31
1 94
2 97
6 89
Name: score, dtype: int64
------两种方式进行比较-------
score
1 True
2 True
3 False
4 False
5 False
6 True
7 False
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
id name score age
1 NaN NaN 94.0 NaN
2 NaN NaN 97.0 NaN
3 NaN NaN NaN NaN
4 NaN NaN NaN NaN
5 NaN NaN NaN NaN
6 NaN NaN 89.0 NaN
7 NaN NaN NaN NaN
score
1 94.0
2 97.0
3 NaN
4 NaN
5 NaN
6 89.0
7 NaN
问题:为什么方式2的结果是这样的,虽然说方式一的条件筛选是Series类型,为什么方式2的条件筛选变成DataFrame就无法筛选了,而且还都是None值。思考很久,辛苦小鱼c解答。
鱼油您好!您观察到的差异源于两种布尔索引的机制不同。
- 当布尔索引是一个 Series(比如 df['score']>70)时,它用于行筛选。Pandas会保留索引标签匹配的所有行,返回完整的DataFrame(只包含满足条件的行),其他列正常显示。
- 当布尔索引是一个 DataFrame(比如 df[['score']]>70 或 df>70)时,它进行元素级筛选。返回与原始DataFrame形状相同的DataFrame,仅保留对应位置为True的值,其他位置填充NaN。因此非筛选列会变成NaN。
在您的代码中,方式1实际上是使用布尔Series进行行筛选(所以得到了完整行),而方式2使用了布尔DataFrame进行元素级筛选(所以只有score列有值,其他列为NaN)。您提到的“方式2变成DataFrame就无法筛选”并不准确——实际上它能筛选,但返回的是NaN填充的完整形状。
正确用法:
- 如果想筛选出score>70的所有行:使用 df[df['score']>70]。
- 如果想保留所有行,仅筛选score列的值:使用 df['score'][df['score']>70] 或 df.loc[df['score']>70, 'score']。
建议检查您的代码书写,确保 df[]>70 实际上是 df['score']>70 的笔误。正确的布尔Series写法应直接指定列名。祝学习愉快!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|