【问题标题】:What is the difference between using df[col][mask] and df[mask][col]?使用 df[col][mask] 和 df[mask][col] 有什么区别?
【发布时间】:2022-01-01 16:27:41
【问题描述】:

以下 pandas 过滤 DataFrame 的方法有什么区别? (在titanic dataset上)。

df_train['Age'][df_train['Pclass']==1]
df_train[df_train['Pclass']==1]['Age']

【问题讨论】:

  • 请提供更多上下文。列表是有序集合,而不是像字典那样的键值存储。您可能会将 Python 列表与其他一些数据结构(如 PANDAS 数据帧)混为一谈。
  • 您应该为 pandas 添加一个标签,看来您使用的是 pandas 数据框而不是列表。此外,您正在使用两个过滤器来对数据框进行子集化,这两个过滤器都会产生相同的答案,因为它们的工作方式类似于 A ^ B 与 B ^ A;其中 ^ 表示交点
  • 语法类似,但x[y]indexing,不一定是列表! (在你的情况下,你可能有一个Pandas DataFrame
  • 哦...很抱歉提出一个没有经验的问题。这是第一次使用堆栈溢出......并且您的所有帮助都很有效。非常感谢。
  • @HenryEcker 请恢复您的出色回答。简短的回答是“两行都产生相同的结果。但是出于相同的原因,两者都是不可取的:切片两次(不必要地)产生熊猫副本而不是切片。副本浪费内存并且是一种不好的编码习惯。避免这样做。解决方案:使用[]/.loc同时从两个维度中选择df_train[df_train['Pclass']==1, 'Age']

标签: python pandas dataframe


【解决方案1】:

它们是通向相同结果的不同路径。

让我们获取一些样本数据:

df_train = pd.DataFrame({
    'Age': [10, 11, 12, 13, 14, 15],
    'Pclass': [1, 0, 1, 0, 0, 1],
    'Other Col': [1, 2, 3, 4, 5, 6],
    'Other Col2': [7, 8, 9, 10, 11, 12]
})
Age Pclass Other Col Other Col2
10 1 1 7
11 0 2 8
12 1 3 9
13 0 4 10
14 0 5 11
15 1 6 12

如果是:

df_train['Age'][df_train['Pclass'] == 1]

我们首先从 DataFrame 中提取“年龄”列(可能会复制系列):

df_train['Age']

0    10
1    11
2    12
3    13
4    14
5    15
Name: Age, dtype: int64

然后根据布尔索引过滤所选列中的行(可能制作另一个副本):

df_train['Age'][df_train['Pclass'] == 1]

0    10
2    12
5    15
Name: Age, dtype: int64

这是两个选项中成本较低的,因为它适用于一系列值。


但是,在另一种情况下:

df_train[df_train['Pclass']==1]['Age']

我们首先过滤 所有 与布尔索引匹配的行(可能制作一个相当大的 DataFrame 的副本):

df_train[df_train['Pclass'] == 1]

   Age  Pclass  Other Col  Other Col2
0   10       1          1           7
2   12       1          3           9
5   15       1          6          12

然后从该行子集中选择生成的 Age 列(可能制作系列 'Age' 的另一个副本):

df_train[df_train['Pclass'] == 1]['Age']

0    10
2    12
5    15
Name: Age, dtype: int64

这可能很昂贵,因为我们需要在过滤行时创建许多不需要的列的子集,然后只选择一列。


但是,最好的方法是使用loc 来同时从两个维度中进行选择:

df_train.loc[df_train['Pclass'] == 1, 'Age']

0    10
2    12
5    15
Name: Age, dtype: int64

这样可以避免在同时选择行和列时创建多个副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-20
    • 2014-03-05
    • 2011-01-31
    • 1970-01-01
    • 2013-12-13
    • 2020-05-26
    相关资源
    最近更新 更多