【问题标题】:Alternatives to awkward Pandas/Python Dataframe Indexing: df_REPEATED[df_REPEATED['var']]>0?笨拙的 Pandas/Python 数据帧索引的替代方案:df_REPEATED[df_REPEATED['var']]>0?
【发布时间】:2017-07-04 19:05:55
【问题描述】:

在 Pandas/Python 中,当以自己的变量为条件时,我必须写两次数据框名称:

df_REPEATED[df_REPEATED['var']>0]

这种情况发生了很多次,似乎不合理。 90-99% 的用户会在 95% 的时间里对以下内容感到满意:

df_REPEATED[['var']>0]

使用.loc[] 时也需要此语法。写这个有什么替代方法或捷径吗?

另一方面,是否有一些我不理解的用例,实际上我在 python 方面的教育严重不足?

【问题讨论】:

    标签: python dataframe indexing syntax


    【解决方案1】:

    不是官方答案...但它最近已经让我的生活变得更简单了:

    https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py

    你不需要下载整个 repo:保存文件并做

    from where import Where as W
    

    应该足够了。然后你像这样使用它:

    df = pd.DataFrame([[1, 2, True],
                       [3, 4, False], 
                       [5, 7, True]],
                      index=range(3), columns=['a', 'b', 'c'])
    # On specific column:
    print(df.loc[W['a'] > 2])
    print(df.loc[-W['a'] == W['b']])
    print(df.loc[~W['c']])
    # On entire DataFrame:
    print(df.loc[W.sum(axis=1) > 3])
    print(df.loc[W[['a', 'b']].diff(axis=1)['b'] > 1])
    

    一个稍微不那么愚蠢的用法示例:

    data = pd.read_csv('ugly_db.csv').loc[~(W == '$null$').any(axis=1)]
    

    编辑:this answer 提到了一种不需要外部组件的类似方法,导致:

    data = (pd.read_csv('ugly_db.csv')
              .loc[lambda df : ~(df == '$null$').any(axis=1)])
    

    另一种可能性是使用.apply(),如

    data = (pd.read_csv('ugly_db.csv')
              .pipe(lambda df : ~(df == '$null$').any(axis=1)))
    

    【讨论】:

      【解决方案2】:

      df_REPEATED['var'] > 0 是一个布尔数组。除了长度之外,它与 DataFrame 没有任何联系。只要长度匹配,它可能是另一个表达式的结果,比如another_df['another_var'] > some_other_value。所以它提供了灵活性。如果语法像你建议的那样,我们就不能这样做。但是,您所要求的还有其他选择。例如,

      df_REPEATED.query('var > 0')
      

      query 如果 DataFrame 很大并且不那么冗长,则可以非常快,但它缺乏布尔索引的优势,如果表达式变得复杂,您就会开始遇到麻烦。

      【讨论】:

      • 好的,我了解 df_REPEATED['var'] > 0 返回的对象以及布尔索引的潜在灵活性,但大多数时候不需要这样做。 df_REPEATED.query('var > 0') 是我们能做的最好的吗?
      • 据我所知,是的。还有 lambda 表达式 df_REPEATED[lambda x: x['var'] > 0](需要 pandas 0.18),但我不会说它更好。当 DataFrame 的名称很长并且需要在索引时多次使用它时,它会变得很有用。
      • 由于 Python 语法的工作方式,['var']>0 已被评估——在现代 Python 中会因 TypeError 而失败——甚至在 pandas 看到它之前。使用字符串参数是 pandas 解决此限制的一种方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 2018-08-10
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多