Pandas 2.2 中文官方教程和指南(十一·一)(2)https://developer.aliyun.com/article/1509861
设置扩大
在为该轴设置不存在的键时,.loc/[]
操作可以执行扩大。
在Series
情况下,这实际上是一个追加操作。
In [141]: se = pd.Series([1, 2, 3]) In [142]: se Out[142]: 0 1 1 2 2 3 dtype: int64 In [143]: se[5] = 5. In [144]: se Out[144]: 0 1.0 1 2.0 2 3.0 5 5.0 dtype: float64
通过.loc
,可以在任一轴上扩大DataFrame
。
In [145]: dfi = pd.DataFrame(np.arange(6).reshape(3, 2), .....: columns=['A', 'B']) .....: In [146]: dfi Out[146]: A B 0 0 1 1 2 3 2 4 5 In [147]: dfi.loc[:, 'C'] = dfi.loc[:, 'A'] In [148]: dfi Out[148]: A B C 0 0 1 0 1 2 3 2 2 4 5 4
这类似于在DataFrame
上进行append
操作。
In [149]: dfi.loc[3] = 5 In [150]: dfi Out[150]: A B C 0 0 1 0 1 2 3 2 2 4 5 4 3 5 5 5
快速标量值获取和设置
由于使用[]
进行索引必须处理许多情况(单标签访问、切片、布尔索引等),因此为了弄清楚您要求的内容,需要一些额外的开销。如果您只想访问标量值,最快的方法是使用在所有数据结构上实现的at
和iat
方法。
与loc
类似,at
提供基于标签的标量查找,而iat
类似于iloc
提供基于整数的查找
In [151]: s.iat[5] Out[151]: 5 In [152]: df.at[dates[5], 'A'] Out[152]: 0.1136484096888855 In [153]: df.iat[3, 0] Out[153]: -0.7067711336300845
您也可以使用这些相同的索引器进行设置。
In [154]: df.at[dates[5], 'E'] = 7 In [155]: df.iat[3, 0] = 7
如果索引器缺失,at
可能会就地扩大对象。
In [156]: df.at[dates[-1] + pd.Timedelta('1 day'), 0] = 7 In [157]: df Out[157]: A B C D E 0 2000-01-01 -0.282863 0.469112 -1.509059 -1.135632 NaN NaN 2000-01-02 -0.173215 1.212112 0.119209 -1.044236 NaN NaN 2000-01-03 -2.104569 -0.861849 -0.494929 1.071804 NaN NaN 2000-01-04 7.000000 0.721555 -1.039575 0.271860 NaN NaN 2000-01-05 0.567020 -0.424972 0.276232 -1.087401 NaN NaN 2000-01-06 0.113648 -0.673690 -1.478427 0.524988 7.0 NaN 2000-01-07 0.577046 0.404705 -1.715002 -1.039268 NaN NaN 2000-01-08 -1.157892 -0.370647 -1.344312 0.844885 NaN NaN 2000-01-09 NaN NaN NaN NaN NaN 7.0
布尔索引
另一个常见操作是使用布尔向量过滤数据。运算符有:|
表示或
,&
表示与
,~
表示非
。这些必须使用括号分组,因为默认情况下,Python 会将表达式如df['A'] > 2 & df['B'] < 3
评估为df['A'] > (2 & df['B']) < 3
,而期望的评估顺序是(df['A'] > 2) & (df['B'] < 3)
。
使用布尔向量索引 Series 的方式与 NumPy ndarray 完全相同:
In [158]: s = pd.Series(range(-3, 4)) In [159]: s Out[159]: 0 -3 1 -2 2 -1 3 0 4 1 5 2 6 3 dtype: int64 In [160]: s[s > 0] Out[160]: 4 1 5 2 6 3 dtype: int64 In [161]: s[(s < -1) | (s > 0.5)] Out[161]: 0 -3 1 -2 4 1 5 2 6 3 dtype: int64 In [162]: s[~(s < 0)] Out[162]: 3 0 4 1 5 2 6 3 dtype: int64
您可以使用与 DataFrame 索引长度相同的布尔向量(例如,从 DataFrame 的列之一派生的内容)选择 DataFrame 的行:
In [163]: df[df['A'] > 0] Out[163]: A B C D E 0 2000-01-04 7.000000 0.721555 -1.039575 0.271860 NaN NaN 2000-01-05 0.567020 -0.424972 0.276232 -1.087401 NaN NaN 2000-01-06 0.113648 -0.673690 -1.478427 0.524988 7.0 NaN 2000-01-07 0.577046 0.404705 -1.715002 -1.039268 NaN NaN
列表推导和 Series 的map
方法也可用于生成更复杂的条件:
In [164]: df2 = pd.DataFrame({'a': ['one', 'one', 'two', 'three', 'two', 'one', 'six'], .....: 'b': ['x', 'y', 'y', 'x', 'y', 'x', 'x'], .....: 'c': np.random.randn(7)}) .....: # only want 'two' or 'three' In [165]: criterion = df2['a'].map(lambda x: x.startswith('t')) In [166]: df2[criterion] Out[166]: a b c 2 two y 0.041290 3 three x 0.361719 4 two y -0.238075 # equivalent but slower In [167]: df2[[x.startswith('t') for x in df2['a']]] Out[167]: a b c 2 two y 0.041290 3 three x 0.361719 4 two y -0.238075 # Multiple criteria In [168]: df2[criterion & (df2['b'] == 'x')] Out[168]: a b c 3 three x 0.361719
使用选择方法按标签选择、按位置选择和高级索引,您可以使用布尔向量结合其他索引表达式沿多个轴选择。
In [169]: df2.loc[criterion & (df2['b'] == 'x'), 'b':'c'] Out[169]: b c 3 x 0.361719
警告
iloc
支持两种布尔索引。如果索引器是布尔Series
,则会引发错误。例如,在以下示例中,df.iloc[s.values, 1]
是可以的。布尔索引器是一个数组。但df.iloc[s, 1]
会引发ValueError
。
In [170]: df = pd.DataFrame([[1, 2], [3, 4], [5, 6]], .....: index=list('abc'), .....: columns=['A', 'B']) .....: In [171]: s = (df['A'] > 2) In [172]: s Out[172]: a False b True c True Name: A, dtype: bool In [173]: df.loc[s, 'B'] Out[173]: b 4 c 6 Name: B, dtype: int64 In [174]: df.iloc[s.values, 1] Out[174]: b 4 c 6 Name: B, dtype: int64
使用 isin 进行索引
考虑Series
的isin()
方法,它返回一个布尔向量,其中Series
元素存在于传递的列表中的位置为真。这使您可以选择具有您想要的值的一个或多个列的行:
In [175]: s = pd.Series(np.arange(5), index=np.arange(5)[::-1], dtype='int64') In [176]: s Out[176]: 4 0 3 1 2 2 1 3 0 4 dtype: int64 In [177]: s.isin([2, 4, 6]) Out[177]: 4 False 3 False 2 True 1 False 0 True dtype: bool In [178]: s[s.isin([2, 4, 6])] Out[178]: 2 2 0 4 dtype: int64
Index
对象也可使用相同方法,并且在您不知道所寻标签中哪些实际存在时非常有用:
In [179]: s[s.index.isin([2, 4, 6])] Out[179]: 4 0 2 2 dtype: int64 # compare it to the following In [180]: s.reindex([2, 4, 6]) Out[180]: 2 2.0 4 0.0 6 NaN dtype: float64
除此之外,MultiIndex
允许选择一个单独的级别用于成员检查:
In [181]: s_mi = pd.Series(np.arange(6), .....: index=pd.MultiIndex.from_product([[0, 1], ['a', 'b', 'c']])) .....: In [182]: s_mi Out[182]: 0 a 0 b 1 c 2 1 a 3 b 4 c 5 dtype: int64 In [183]: s_mi.iloc[s_mi.index.isin([(1, 'a'), (2, 'b'), (0, 'c')])] Out[183]: 0 c 2 1 a 3 dtype: int64 In [184]: s_mi.iloc[s_mi.index.isin(['a', 'c', 'e'], level=1)] Out[184]: 0 a 0 c 2 1 a 3 c 5 dtype: int64
DataFrame 还有一个 isin()
方法。在调用 isin
时,将一组值作为数组或字典传递。如果值是一个数组,isin
返回一个与原始 DataFrame 形状相同的布尔值 DataFrame,其中元素在值序列中的位置为 True。
In [185]: df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': ['a', 'b', 'f', 'n'], .....: 'ids2': ['a', 'n', 'c', 'n']}) .....: In [186]: values = ['a', 'b', 1, 3] In [187]: df.isin(values) Out[187]: vals ids ids2 0 True True True 1 False True False 2 True False False 3 False False False
通常你会想要将某些值与某些列匹配。只需将值设为一个 dict
,其中键是列,值是你想要检查的项目列表。
In [188]: values = {'ids': ['a', 'b'], 'vals': [1, 3]} In [189]: df.isin(values) Out[189]: vals ids ids2 0 True True False 1 False True False 2 True False False 3 False False False
要返回值不在原始 DataFrame 中的布尔值 DataFrame,请使用 ~
运算符:
In [190]: values = {'ids': ['a', 'b'], 'vals': [1, 3]} In [191]: ~df.isin(values) Out[191]: vals ids ids2 0 False False True 1 True False True 2 False True True 3 True True True
将 DataFrame 的 isin
与 any()
和 all()
方法结合使用,快速选择满足给定条件的数据子集。要选择每列都满足自己条件的行:
In [192]: values = {'ids': ['a', 'b'], 'ids2': ['a', 'c'], 'vals': [1, 3]} In [193]: row_mask = df.isin(values).all(1) In [194]: df[row_mask] Out[194]: vals ids ids2 0 1 a a ```## `where()` 方法和掩码 使用布尔向量从 Series 中选择值通常会返回数据的子集。为了确保选择输出具有与原始数据相同的形状,可以在 `Series` 和 `DataFrame` 中使用 `where` 方法。 仅返回选定的行: ```py In [195]: s[s > 0] Out[195]: 3 1 2 2 1 3 0 4 dtype: int64
要返回与原始形状相同的 Series:
In [196]: s.where(s > 0) Out[196]: 4 NaN 3 1.0 2 2.0 1 3.0 0 4.0 dtype: float64
现在使用布尔条件从 DataFrame 中选择值也会保留输入数据形状。where
在幕后作为实现使用。下面的代码等同于 df.where(df < 0)
。
In [197]: dates = pd.date_range('1/1/2000', periods=8) In [198]: df = pd.DataFrame(np.random.randn(8, 4), .....: index=dates, columns=['A', 'B', 'C', 'D']) .....: In [199]: df[df < 0] Out[199]: A B C D 2000-01-01 -2.104139 -1.309525 NaN NaN 2000-01-02 -0.352480 NaN -1.192319 NaN 2000-01-03 -0.864883 NaN -0.227870 NaN 2000-01-04 NaN -1.222082 NaN -1.233203 2000-01-05 NaN -0.605656 -1.169184 NaN 2000-01-06 NaN -0.948458 NaN -0.684718 2000-01-07 -2.670153 -0.114722 NaN -0.048048 2000-01-08 NaN NaN -0.048788 -0.808838
此外,where
接受一个可选的 other
参数,用于在返回的副本中替换条件为 False 的值。
In [200]: df.where(df < 0, -df) Out[200]: A B C D 2000-01-01 -2.104139 -1.309525 -0.485855 -0.245166 2000-01-02 -0.352480 -0.390389 -1.192319 -1.655824 2000-01-03 -0.864883 -0.299674 -0.227870 -0.281059 2000-01-04 -0.846958 -1.222082 -0.600705 -1.233203 2000-01-05 -0.669692 -0.605656 -1.169184 -0.342416 2000-01-06 -0.868584 -0.948458 -2.297780 -0.684718 2000-01-07 -2.670153 -0.114722 -0.168904 -0.048048 2000-01-08 -0.801196 -1.392071 -0.048788 -0.808838
你可能希望根据一些布尔条件设置值。这可以直观地这样做:
In [201]: s2 = s.copy() In [202]: s2[s2 < 0] = 0 In [203]: s2 Out[203]: 4 0 3 1 2 2 1 3 0 4 dtype: int64 In [204]: df2 = df.copy() In [205]: df2[df2 < 0] = 0 In [206]: df2 Out[206]: A B C D 2000-01-01 0.000000 0.000000 0.485855 0.245166 2000-01-02 0.000000 0.390389 0.000000 1.655824 2000-01-03 0.000000 0.299674 0.000000 0.281059 2000-01-04 0.846958 0.000000 0.600705 0.000000 2000-01-05 0.669692 0.000000 0.000000 0.342416 2000-01-06 0.868584 0.000000 2.297780 0.000000 2000-01-07 0.000000 0.000000 0.168904 0.000000 2000-01-08 0.801196 1.392071 0.000000 0.000000
where
返回数据的修改副本。
注意
DataFrame.where()
的签名与 numpy.where()
不同。大致上 df1.where(m, df2)
等同于 np.where(m, df1, df2)
。
In [207]: df.where(df < 0, -df) == np.where(df < 0, df, -df) Out[207]: A B C D 2000-01-01 True True True True 2000-01-02 True True True True 2000-01-03 True True True True 2000-01-04 True True True True 2000-01-05 True True True True 2000-01-06 True True True True 2000-01-07 True True True True 2000-01-08 True True True True
对齐
此外,where
对齐输入的布尔条件(ndarray 或 DataFrame),使得可以进行部分选择设置。这类似于通过 .loc
进行部分设置(但是在内容而不是轴标签上)。
In [208]: df2 = df.copy() In [209]: df2[df2[1:4] > 0] = 3 In [210]: df2 Out[210]: A B C D 2000-01-01 -2.104139 -1.309525 0.485855 0.245166 2000-01-02 -0.352480 3.000000 -1.192319 3.000000 2000-01-03 -0.864883 3.000000 -0.227870 3.000000 2000-01-04 3.000000 -1.222082 3.000000 -1.233203 2000-01-05 0.669692 -0.605656 -1.169184 0.342416 2000-01-06 0.868584 -0.948458 2.297780 -0.684718 2000-01-07 -2.670153 -0.114722 0.168904 -0.048048 2000-01-08 0.801196 1.392071 -0.048788 -0.808838
where
还可以接受 axis
和 level
参数,以在执行 where
时对齐输入。
In [211]: df2 = df.copy() In [212]: df2.where(df2 > 0, df2['A'], axis='index') Out[212]: A B C D 2000-01-01 -2.104139 -2.104139 0.485855 0.245166 2000-01-02 -0.352480 0.390389 -0.352480 1.655824 2000-01-03 -0.864883 0.299674 -0.864883 0.281059 2000-01-04 0.846958 0.846958 0.600705 0.846958 2000-01-05 0.669692 0.669692 0.669692 0.342416 2000-01-06 0.868584 0.868584 2.297780 0.868584 2000-01-07 -2.670153 -2.670153 0.168904 -2.670153 2000-01-08 0.801196 1.392071 0.801196 0.801196
这等同于(但比以下更快)。
In [213]: df2 = df.copy() In [214]: df.apply(lambda x, y: x.where(x > 0, y), y=df['A']) Out[214]: A B C D 2000-01-01 -2.104139 -2.104139 0.485855 0.245166 2000-01-02 -0.352480 0.390389 -0.352480 1.655824 2000-01-03 -0.864883 0.299674 -0.864883 0.281059 2000-01-04 0.846958 0.846958 0.600705 0.846958 2000-01-05 0.669692 0.669692 0.669692 0.342416 2000-01-06 0.868584 0.868584 2.297780 0.868584 2000-01-07 -2.670153 -2.670153 0.168904 -2.670153 2000-01-08 0.801196 1.392071 0.801196 0.801196
where
可以接受一个可调用的条件和 other
参数。该函数必须带有一个参数(调用的 Series 或 DataFrame),并返回有效的输出作为条件和 other
参数。
In [215]: df3 = pd.DataFrame({'A': [1, 2, 3], .....: 'B': [4, 5, 6], .....: 'C': [7, 8, 9]}) .....: In [216]: df3.where(lambda x: x > 4, lambda x: x + 10) Out[216]: A B C 0 11 14 7 1 12 5 8 2 13 6 9
掩码
mask()
是 where
的反布尔操作。
In [217]: s.mask(s >= 0) Out[217]: 4 NaN 3 NaN 2 NaN 1 NaN 0 NaN dtype: float64 In [218]: df.mask(df >= 0) Out[218]: A B C D 2000-01-01 -2.104139 -1.309525 NaN NaN 2000-01-02 -0.352480 NaN -1.192319 NaN 2000-01-03 -0.864883 NaN -0.227870 NaN 2000-01-04 NaN -1.222082 NaN -1.233203 2000-01-05 NaN -0.605656 -1.169184 NaN 2000-01-06 NaN -0.948458 NaN -0.684718 2000-01-07 -2.670153 -0.114722 NaN -0.048048 2000-01-08 NaN NaN -0.048788 -0.808838 ```## 使用`numpy()` 条件性扩展设置 一个替代`where()`的方法是使用[`numpy.where()`](https://numpy.org/doc/stable/reference/generated/numpy.where.html#numpy.where "(在 NumPy v1.26 中)")。结合设置一个新列,您可以使用它来根据条件扩展 DataFrame。 假设您在以下 DataFrame 中有两个选择。当第二列为‘Z’时,您希望将新列颜色设置为‘green’。您可以执行以下操作: ```py In [219]: df = pd.DataFrame({'col1': list('ABBC'), 'col2': list('ZZXY')}) In [220]: df['color'] = np.where(df['col2'] == 'Z', 'green', 'red') In [221]: df Out[221]: col1 col2 color 0 A Z green 1 B Z green 2 B X red 3 C Y red
如果您有多个条件,您可以使用numpy.select()
来实现。假设对应于三个条件有三种颜色选择,第四种颜色作为备用,您可以执行以下操作。
In [222]: conditions = [ .....: (df['col2'] == 'Z') & (df['col1'] == 'A'), .....: (df['col2'] == 'Z') & (df['col1'] == 'B'), .....: (df['col1'] == 'B') .....: ] .....: In [223]: choices = ['yellow', 'blue', 'purple'] In [224]: df['color'] = np.select(conditions, choices, default='black') In [225]: df Out[225]: col1 col2 color 0 A Z yellow 1 B Z blue 2 B X purple 3 C Y black ```## `query()` 方法 `DataFrame` 对象具有允许使用表达式进行选择的`query()` 方法。 您可以获取列`b`的值在列`a`和`c`的值之间的帧的值。例如: ```py In [226]: n = 10 In [227]: df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc')) In [228]: df Out[228]: a b c 0 0.438921 0.118680 0.863670 1 0.138138 0.577363 0.686602 2 0.595307 0.564592 0.520630 3 0.913052 0.926075 0.616184 4 0.078718 0.854477 0.898725 5 0.076404 0.523211 0.591538 6 0.792342 0.216974 0.564056 7 0.397890 0.454131 0.915716 8 0.074315 0.437913 0.019794 9 0.559209 0.502065 0.026437 # pure python In [229]: df[(df['a'] < df['b']) & (df['b'] < df['c'])] Out[229]: a b c 1 0.138138 0.577363 0.686602 4 0.078718 0.854477 0.898725 5 0.076404 0.523211 0.591538 7 0.397890 0.454131 0.915716 # query In [230]: df.query('(a < b) & (b < c)') Out[230]: a b c 1 0.138138 0.577363 0.686602 4 0.078718 0.854477 0.898725 5 0.076404 0.523211 0.591538 7 0.397890 0.454131 0.915716
做同样的事情,但如果没有名为a
的列,则回退到命名索引。
In [231]: df = pd.DataFrame(np.random.randint(n / 2, size=(n, 2)), columns=list('bc')) In [232]: df.index.name = 'a' In [233]: df Out[233]: b c a 0 0 4 1 0 1 2 3 4 3 4 3 4 1 4 5 0 3 6 0 1 7 3 4 8 2 3 9 1 1 In [234]: df.query('a < b and b < c') Out[234]: b c a 2 3 4
如果您不想或不能命名您的索引,您可以在查询表达式中使用名称index
:
In [235]: df = pd.DataFrame(np.random.randint(n, size=(n, 2)), columns=list('bc')) In [236]: df Out[236]: b c 0 3 1 1 3 0 2 5 6 3 5 2 4 7 4 5 0 1 6 2 5 7 0 1 8 6 0 9 7 9 In [237]: df.query('index < b < c') Out[237]: b c 2 5 6
注意
如果您的索引名称与列名重叠,则列名优先。例如,
In [238]: df = pd.DataFrame({'a': np.random.randint(5, size=5)}) In [239]: df.index.name = 'a' In [240]: df.query('a > 2') # uses the column 'a', not the index Out[240]: a a 1 3 3 3
您仍然可以通过使用特殊标识符‘index’在查询表达式中使用索引:
In [241]: df.query('index > 2') Out[241]: a a 3 3 4 2
如果由于某种原因您有一个名为index
的列,那么您也可以将索引称为ilevel_0
,但在这一点上,您应该考虑将列重命名为不那么模糊的名称。
MultiIndex
query()
语法
您还可以像使用列一样使用具有MultiIndex
的DataFrame
的级别:
In [242]: n = 10 In [243]: colors = np.random.choice(['red', 'green'], size=n) In [244]: foods = np.random.choice(['eggs', 'ham'], size=n) In [245]: colors Out[245]: array(['red', 'red', 'red', 'green', 'green', 'green', 'green', 'green', 'green', 'green'], dtype='<U5') In [246]: foods Out[246]: array(['ham', 'ham', 'eggs', 'eggs', 'eggs', 'ham', 'ham', 'eggs', 'eggs', 'eggs'], dtype='<U4') In [247]: index = pd.MultiIndex.from_arrays([colors, foods], names=['color', 'food']) In [248]: df = pd.DataFrame(np.random.randn(n, 2), index=index) In [249]: df Out[249]: 0 1 color food red ham 0.194889 -0.381994 ham 0.318587 2.089075 eggs -0.728293 -0.090255 green eggs -0.748199 1.318931 eggs -2.029766 0.792652 ham 0.461007 -0.542749 ham -0.305384 -0.479195 eggs 0.095031 -0.270099 eggs -0.707140 -0.773882 eggs 0.229453 0.304418 In [250]: df.query('color == "red"') Out[250]: 0 1 color food red ham 0.194889 -0.381994 ham 0.318587 2.089075 eggs -0.728293 -0.090255
如果MultiIndex
的级别未命名,您可以使用特殊名称引用它们:
In [251]: df.index.names = [None, None] In [252]: df Out[252]: 0 1 red ham 0.194889 -0.381994 ham 0.318587 2.089075 eggs -0.728293 -0.090255 green eggs -0.748199 1.318931 eggs -2.029766 0.792652 ham 0.461007 -0.542749 ham -0.305384 -0.479195 eggs 0.095031 -0.270099 eggs -0.707140 -0.773882 eggs 0.229453 0.304418 In [253]: df.query('ilevel_0 == "red"') Out[253]: 0 1 red ham 0.194889 -0.381994 ham 0.318587 2.089075 eggs -0.728293 -0.090255
约定是ilevel_0
,表示“索引级别 0”对于index
的第 0 级。
query()
使用案例
使用query()
的一个用例是当你有一组DataFrame
对象,它们具有一些共同的列名(或索引级别/名称)。您可以将相同的查询传递给两个框架,而不需要指定您要查询的框架。
In [254]: df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc')) In [255]: df Out[255]: a b c 0 0.224283 0.736107 0.139168 1 0.302827 0.657803 0.713897 2 0.611185 0.136624 0.984960 3 0.195246 0.123436 0.627712 4 0.618673 0.371660 0.047902 5 0.480088 0.062993 0.185760 6 0.568018 0.483467 0.445289 7 0.309040 0.274580 0.587101 8 0.258993 0.477769 0.370255 9 0.550459 0.840870 0.304611 In [256]: df2 = pd.DataFrame(np.random.rand(n + 2, 3), columns=df.columns) In [257]: df2 Out[257]: a b c 0 0.357579 0.229800 0.596001 1 0.309059 0.957923 0.965663 2 0.123102 0.336914 0.318616 3 0.526506 0.323321 0.860813 4 0.518736 0.486514 0.384724 5 0.190804 0.505723 0.614533 6 0.891939 0.623977 0.676639 7 0.480559 0.378528 0.460858 8 0.420223 0.136404 0.141295 9 0.732206 0.419540 0.604675 10 0.604466 0.848974 0.896165 11 0.589168 0.920046 0.732716 In [258]: expr = '0.0 <= a <= c <= 0.5' In [259]: map(lambda frame: frame.query(expr), [df, df2]) Out[259]: <map at 0x7ff2e57db2e0>
query()
Python 与 pandas 语法比较
完整的类似 numpy 的语法:
In [260]: df = pd.DataFrame(np.random.randint(n, size=(n, 3)), columns=list('abc')) In [261]: df Out[261]: a b c 0 7 8 9 1 1 0 7 2 2 7 2 3 6 2 2 4 2 6 3 5 3 8 2 6 1 7 2 7 5 1 5 8 9 8 0 9 1 5 0 In [262]: df.query('(a < b) & (b < c)') Out[262]: a b c 0 7 8 9 In [263]: df[(df['a'] < df['b']) & (df['b'] < df['c'])] Out[263]: a b c 0 7 8 9
通过去除括号(比较运算符比&
和|
绑定更紧)稍微更好:
In [264]: df.query('a < b & b < c') Out[264]: a b c 0 7 8 9
使用英语而不是符号:
In [265]: df.query('a < b and b < c') Out[265]: a b c 0 7 8 9
与您可能在纸上写的方式非常接近:
In [266]: df.query('a < b < c') Out[266]: a b c 0 7 8 9
Pandas 2.2 中文官方教程和指南(十一·一)(4)https://developer.aliyun.com/article/1509863