如何引用pandas中查询字符串中的未命名列?

2izufjch  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(654)

使用pandas.dataframe.query时,如何引用查询字符串中未命名的dataframe列?我知道我可以通过将列名用倒勾括起来来识别不是有效python变量名的列名。但是,这并不涉及未命名的列。
例如,我想查询dataframe中未命名列包含大于0.5的值的所有行。
我的代码是这样开始的:

import pandas as pd
import numpy as np
array=np.random.rand(10,3)
df=pd.DataFrame(array)

到目前为止还不错,但是当我尝试使用pandas.dataframe.query时,我应该使用什么查询字符串来查找第二列(未命名)中的值大于0.5的行?
我能想到的最接近的事情是

df.query('columns[1]>0.5')

这是完全错误的,因为列[1]返回列号1,并且不引用未命名的列。
我查看了Pandas的文档,包括
https://pandas.pydata.org/docs/reference/api/pandas.dataframe.query.html#pandas.dataframe.query
https://pandas.pydata.org/docs/user_guide/indexing.html#indexing-质疑
有什么想法吗?

yrdbyhpb

yrdbyhpb1#

有几种方法可以实现您的目标:

虚拟 Dataframe :

>>> df
          0         1         2
0  0.210862  0.894414  0.713472
1  0.804793  0.656390  0.842293
2  0.617104  0.763162  0.697050
3  0.158506  0.190683  0.740970
4  0.380092  0.984326  0.138277
5  0.665413  0.445192  0.525754
6  0.274770  0.870642  0.987045
7  0.619918  0.196403  0.221361
8  0.642992  0.572529  0.893655
9  0.101074  0.871377  0.130874

解决方案:

在另一种情况下,如果您使用未命名的列,您可以按如下方式查找dataframe列中的所有行,但请记住,它将保留不匹配的值 NaN 同时显示所有匹配项。

>>> df[ df.iloc[:,df.columns]> 0.5 ]
          0         1         2
0       NaN  0.894414  0.713472
1  0.804793  0.656390  0.842293
2  0.617104  0.763162  0.697050
3       NaN       NaN  0.740970
4       NaN  0.984326       NaN
5  0.665413       NaN  0.525754
6       NaN  0.870642  0.987045
7  0.619918       NaN       NaN
8  0.642992  0.572529  0.893655
9       NaN  0.871377       NaN
w46czmvw

w46czmvw2#

解决方案

小结:下面给出了最佳选项。有关所有其他选项,请参阅下文。
df.query('@df[1] > 0.5') df[df[1] > 0.5] Pandas中未命名的列将自动命名为 0, 1, 2, ... ,其中这些是数字而不是字符串。
下面向您展示了实现所需目标的三种主要方法。
选项1:避免重命名列。
选项-1.1:使用 df.query('@df[1] > 0.5') . 这里我们使用 @df 具体说明 df 是一个变量。
选项1.2:这里我们使用另一个选项 df[df[1] > 0.5] .
选项2.x:重命名数据框的列 df 通过提供 dict : {0: 'A', 1: 'B', 2: 'C'} .
你可以用 df.query() 在这种情况下。
选项3:重命名 df 以听写理解为例 C# 哪里 # 表示列编号。
你可以用 df.query() 在这种情况下。


## Option-1: without renaming

# Option-1.1: with query

df.query('@df[1] > 0.5')

# Option-1.2: without using query

df[df[1] > 0.5]

## Option-2: rename columns (using a mapping provided manually)

# columns = {0: 'A', 1: 'B', 2: 'C'}

df = pd.DataFrame(arr).rename(columns={0: 'A', 1: 'B', 2: 'C'})

# Option-2.1

df[df['B'] > 0.5]

# Option-2.2

df[df.B > 0.5]

# Option-2.2

df.query('B > 0.5')

## Option-3: rename dynamically

df = pd.DataFrame(arr)
df = df.rename(columns=dict((x, 'C'+str(x)) for x in df.columns))
df.query('C1 > 0.5')

输出:

0         1         2
3  0.413839  0.889178  0.564845
5  0.802746  0.941901  0.564068
6  0.904837  0.716764  0.151075
8  0.788026  0.749503  0.960260

虚拟数据

import pandas as pd
import numpy as np

arr = np.random.rand(10, 3)
df = pd.DataFrame(arr)

参考资料

文件: pandas.DataFrame.query stackoverflow:如何在pandas中查询数字列名?
老Pandas医生: multiindex-query-syntax v-13.0

相关问题