python - Pandas 数据框默认使用 .loc

标签 python pandas dataframe

我知道访问 Pandas 数据框中的索引/列的常用方法(另请参阅索引 guide ):

  • df.iloc[..., ...]对于整数位置
  • df.loc[..., ...]用于基于标签的位置
  • df.ix (已弃用)
  • df['C1']df.C1用于列访问
  • df['mylabel1':'mylabel10']df[2:7]用于行切片访问,但是 df['mylabel1']df[2]显然不行

我总是发现最后两个要点令人困惑,因为我们使用相同的符号 df[...]用于列访问或行访问。

问题:有没有一种方法可以配置 Pandas(或 DataFrame 的子类)来简化一切:

df[...] is in fact an alias for df.loc[...]

<强>?

示例:

import numpy as np
import pandas as pd
x = pd.DataFrame(columns=['C1', 'C1', 'C2'])
x.loc['a'] = [np.random.rand(2000, 500), np.random.rand(2000, 500), np.random.rand(2000)]
print(x.loc['a', 'C2'])
x['a', 'C2']       # should give the same thing, so that by default, x[...] is the same as x.loc[...]

最佳答案

Python 中的每个表达式都会有一个对象作为结果,因此您可以为其分配一个名称:

xl=x.loc
xl['a']=…           # equivalent to x.loc['a']=…

您无法以这种方式模拟x.loc=…,因为分配给xl只会重新绑定(bind)名称;这可能与这里无关,但为了完整性,(稍微)缩短此类内容的唯一方法是编写类似的内容

class Setter:
  def __init__(self,x): self.x=x
  def __getattr__(self,n):
    return lambda(v): setattr(self.x,n,v)
xset=Setter(x).loc
xset(…)             # equivalent to x.loc=…

如果您希望有一个名称仍然支持其他访问模式,您可以编写一个包装类:

class DFLoc:
  def __init__(self,x): self.x=x
  def __getitem__(self,k): return self.x.loc[k]
  def __getattr__(self,n): return getattr(self.x,n)

此方法还允许您支持依赖于以下事实的库:x.loc 等构造结果仅与 __setitem__< 使用一次/ 之后。 (这通常是此类库中的错误,尽管在某些情况下此类计算属性的将取决于通过它所做的更改。)

关于python - Pandas 数据框默认使用 .loc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72741696/

相关文章:

python - matplotlib/ Pandas : put line label along the plotted lines in time series plot

Python/Pandas if 语句和索引

python - 添加基于报告的层级

python - 对除 pandas 中的一列以外的所有列应用标准化

python - 如何使用一个 CSV 列标准化 Python 矩阵?

python - 使用列表推导构建元组

python - 从另一个区域连接到 DocumentDB

python - 如何找到字典项目中元素最多的列表?

python - Pandas 中多列的逻辑与

python - 将一个级别(具有固定值)附加到 pandas Series/DataFrame