【问题标题】:Filter a dataframe by column index in a chain, without using the column name or table name按链中的列索引过滤数据框,而不使用列名或表名
【发布时间】:2023-01-20 01:40:50
【问题描述】:

生成示例数据框

import random
import string
import numpy as np
df = pd.DataFrame(
    columns=[random.choice(string.ascii_uppercase) for i in range(5)],
    data=np.random.rand(10,5))
df
          V         O         C         X         E
0  0.060255  0.341051  0.288854  0.740567  0.236282
1  0.933778  0.393021  0.547383  0.469255  0.053089
2  0.994518  0.156547  0.917894  0.070152  0.201373
3  0.077694  0.685540  0.865004  0.830740  0.605135
4  0.760294  0.838441  0.905885  0.146982  0.157439
5  0.116676  0.340967  0.400340  0.293894  0.220995
6  0.632182  0.663218  0.479900  0.931314  0.003180
7  0.726736  0.276703  0.057806  0.624106  0.719631
8  0.677492  0.200079  0.374410  0.962232  0.915361
9  0.061653  0.984166  0.959516  0.261374  0.361677

现在我想使用第一列中的值过滤数据框,但由于我大量使用链接(例如df.T.replace(0, np.nan).pipe(np.log2).mean(axis=1).fillna(0).pipe(func)),我需要一个更紧凑的操作符号。通常你会做类似的事情

df[df.iloc[:, 0] < 0.5]
          V         O         C         X         E
0  0.060255  0.341051  0.288854  0.740567  0.236282
3  0.077694  0.685540  0.865004  0.830740  0.605135
5  0.116676  0.340967  0.400340  0.293894  0.220995
9  0.061653  0.984166  0.959516  0.261374  0.361677

但是笨拙的冗余语法对于链接来说是可怕的。我想用 .query() 替换它,通常你会使用像 df.query('V &lt; 0.5') 这样的列名,但在这里我希望能够通过列索引号而不是名称来查询表。所以在这个例子中,我故意随机化了列名。我也不能在 df.query('@df[0] &lt; 0.5') 之类的查询中使用表名,因为在长链中,中间结果没有名称。

我希望有一些语法,例如 df.query('_[0] &lt; 0.05'),我可以在其中将源表引用为某个符号 _

【问题讨论】:

  • df.query(f"{df.columns[0]}&lt;0.5") 呢?

标签: python pandas dataframe


【解决方案1】:

您可以在 loc 中使用 lambda 函数,它传入数据帧。然后,您可以使用 iloc 作为您的位置索引。所以你可以这样做:

df.loc[lambda x: x.iloc[:, 0] > 0.5]

这应该在方法链中工作。

【讨论】:

    【解决方案2】:

    您可以在 df.query 中使用 f 字符串表示法:

    df.query(f'{df.columns[0]} < .5')
    

    输出:

              J         M         O         R         N
    3  0.114554  0.131948  0.650307  0.672486  0.688872
    4  0.272368  0.745900  0.544068  0.504299  0.434122
    6  0.418988  0.023691  0.450398  0.488476  0.787383
    7  0.040440  0.220282  0.263902  0.660016  0.955950
    

    【讨论】:

      【解决方案3】:

      对于具有索引的单个列:

      df.query(f"{df.columns[0]}<0.5")
      
                V         O         C         X         E
      0  0.060255  0.341051  0.288854  0.740567  0.236282
      3  0.077694  0.685540  0.865004  0.830740  0.605135
      5  0.116676  0.340967  0.400340  0.293894  0.220995
      9  0.061653  0.984166  0.959516  0.261374  0.361677
      

      对于具有索引的多列:

      idx = [0,1]
      col = df.columns[np.r_[idx]]
      val = 0.5
      query = ' and '.join([f"{i} < {val}" for i in col])
      # V < 0.5 and O < 0.5
      print(df.query(query))
      
                V         O         C         X         E
      0  0.060255  0.341051  0.288854  0.740567  0.236282
      5  0.116676  0.340967  0.400340  0.293894  0.220995
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多