4.3 混合选择:ix[] (不推荐,建议使用 loc 或 iloc) 4.3 混合选择: (不推荐,建议使用 或 ) 在 Pandas 中, 曾经是一种用于混合选择数据的方法,它允许你同时使用标签和整数索引来访问 DataFrame 或 Series 中的数据。然而,由于其行为的模糊性和可能产生的歧义, 已被标记为不推荐使用,并且在较新的 Pandas 版本中可能会被移除。因此,强烈建议使用 和 来进行数据选择,因为它们提供了更明确和可预测的行为。 的工作原理 (已过时) 尝试根据提供的索引类型来智能地选择数据。它的工作方式如下: 如果传递的是标签: 表现得像 ,即基于标签进行选择。 如果传递的是整数: 表现得像 ,即基于整数索引进行选择。
ix[] (不推荐,建议使用 loc 或 iloc)在 Pandas 中,ix[] 曾经是一种用于混合选择数据的方法,它允许你同时使用标签和整数索引来访问 DataFrame 或 Series 中的数据。然而,由于其行为的模糊性和可能产生的歧义,ix[] 已被标记为不推荐使用,并且在较新的 Pandas 版本中可能会被移除。因此,强烈建议使用 loc[] 和 iloc[] 来进行数据选择,因为它们提供了更明确和可预测的行为。
ix[] 的工作原理 (已过时)ix[] 尝试根据提供的索引类型来智能地选择数据。它的工作方式如下:
如果传递的是标签:ix[] 表现得像 loc[],即基于标签进行选择。
如果传递的是整数:ix[] 表现得像 iloc[],即基于整数索引进行选择。
如果索引同时包含标签和整数:ix[] 的行为可能变得模糊,并且可能导致意外的结果。
ix[] 的问题与歧义ix[] 的主要问题在于其行为的模糊性。当 DataFrame 的索引是整数类型时,ix[] 无法区分是基于标签的索引还是基于位置的索引,这可能导致意外的结果。
例如,考虑以下 DataFrame:
import pandas as pd df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=[1, 2, 3]) print(df)
输出:
A B 1 1 4 2 2 5 3 3 6
如果使用 df.ix[1],你可能期望访问索引为 1 的行(即标签为 1 的行)。然而,ix[] 可能会将其解释为基于位置的索引,从而返回第一行(索引为 0 的行,但标签为1的行)。这种歧义性是 ix[] 被弃用的主要原因。
loc[] 和 iloc[]loc[] 和 iloc[] 提供了更明确和可预测的行为,从而避免了 ix[] 的歧义性。
loc[]: 基于标签进行选择。无论索引的类型是什么,loc[] 始终使用标签来选择数据。
iloc[]: 基于整数索引进行选择。iloc[] 始终使用整数索引来选择数据,忽略索引的实际标签。
使用 loc[] 和 iloc[] 可以避免混淆,并使代码更易于理解和维护。
以下是一些使用 ix[] (不推荐) 以及 loc[] 和 iloc[] 的代码示例,以说明它们之间的差异和推荐的使用方法。
1. 使用 ix[] (不推荐)
import pandas as pd df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=[1, 2, 3]) # 使用 ix[] 选择标签为 1 的行 (可能产生歧义) # 注意:在新的pandas版本中,ix[]可能已经无法使用,或者会给出警告 # print(df.ix[1]) # 不推荐
2. 使用 loc[] (推荐)
import pandas as pd df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=[1, 2, 3]) # 使用 loc[] 选择标签为 1 的行 print(df.loc[1]) # 使用 loc[] 选择标签为 1 和 2 的行 print(df.loc[[1, 2]]) # 使用 loc[] 选择标签为 1 的行的 'A' 列 print(df.loc[1, 'A']) # 使用 loc[] 选择标签为 1 和 2 的行的 'A' 和 'B' 列 print(df.loc[[1, 2], ['A', 'B']])
3. 使用 iloc[] (推荐)
import pandas as pd df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=[1, 2, 3]) # 使用 iloc[] 选择第一行 (整数索引为 0) print(df.iloc[0]) # 使用 iloc[] 选择第一行和第二行 print(df.iloc[[0, 1]]) # 使用 iloc[] 选择第一行的第一列 print(df.iloc[0, 0]) # 使用 iloc[] 选择第一行和第二行的第一列和第二列 print(df.iloc[[0, 1], [0, 1]])
总结 loc[] 和 iloc[] 的使用场景:
loc[]: 当你知道行或列的标签时,使用 loc[]。例如,根据日期、股票代码或客户 ID 选择数据。
iloc[]: 当你知道行或列的整数索引时,使用 iloc[]。例如,选择 DataFrame 的前几行或特定列。
loc[] vs iloc[]以下是一个 Mermaid 图,说明了 loc[] 和 iloc[] 之间的区别:
图解:
从 "选择数据" 开始。
判断是否使用标签进行选择。
如果是,则使用 loc[],它基于标签选择数据。
如果否,则使用 iloc[],它基于整数索引选择数据。
最后,返回选定的数据。
ix[] 的最佳实践始终使用 loc[] 或 iloc[] 来进行数据选择。
明确指定是基于标签还是基于整数索引进行选择。
避免在混合索引的情况下使用 ix[]。
在更新 Pandas 版本时,检查 ix[] 是否已被移除,并将其替换为 loc[] 或 iloc[]。
虽然 ix[] 曾经是一种方便的混合选择方法,但由于其行为的模糊性和可能产生的歧义,它已被标记为不推荐使用。为了编写更清晰、更易于维护的代码,强烈建议使用 loc[] 和 iloc[] 来进行数据选择。loc[] 基于标签进行选择,而 iloc[] 基于整数索引进行选择。通过明确指定是基于标签还是基于整数索引进行选择,可以避免混淆,并确保代码的行为符合预期。
总而言之,拥抱 loc[] 和 iloc[],告别 ix[],你的 Pandas 代码将会更加健壮和易于理解。 记住,清晰的代码胜过任何花哨的技巧。