pandas Python是否有一个等价的“Set”命令?(用于操作对象的简短用户定义引用)

c3frrgcw  于 2023-10-14  发布在  Python
关注(0)|答案(3)|浏览(90)

我有这样一行,它将这个单元格的值更改为5:

df[header].at[row_num] = 5

我想知道是否有一个更清晰/更短的方式来引用df[header].at[row_num]
在Python中有一个“Set”命令,它可以完成相同的工作,但方式更简单:

# Note..this 'set' command is borrowed from VBA.
# This is not the python 'set' command that applies to sets like {1,2,3}
set my_cell = df[header].at[row_num]
my_cell = 5

在这个例子中,一旦我做了那个delcaration,我就不需要再写这个长代码df[header].at[row_num]了,因为我可以使用my_cell = 5来精确地等价于df[header].at[row_num] = 5

dsf9zpds

dsf9zpds1#

在Python中,你不能重载=。它不是操作员。
您可以创建一个代理对象,该对象包含该框架及其索引,并使用set()get()方法修改该框架

import pandas as pd

class DFRef:
  def __init__(self, df, row, col) -> None:
    self.df = df
    self.row = row
    self.col = col
  def set(self, val):
    self.df.at[self.row, self.col] = val
  def get(self):
    return self.df.at[self.row, self.col]

data = [['Axel',32], ['Alice', 26], ['Anton', 45]]
df = pd.DataFrame(data,columns=['Name','Age'])

myrefName = DFRef(df, 1, 'Name')
myrefAge = DFRef(df, 1, 'Age')
myrefName.set('Audrie')
myrefAge.set(66)
print(myrefName.get())
print('=====')
print(df)
kx7yvsdv

kx7yvsdv2#

使用loc,它的工作原理与您的代码相同。

row_num = 100
header = 'xxx'
df.loc[row_num, header] = 5

如果您想更改multiple rows中的值,例如从1到100:

df.loc[1:101, header] = 5

如果你想改变several columns中值,所有这些列的值将被改变为5,例如'col_1','col_2':

df.loc[:, ['col_1', 'col_2']] = 5

如果你想在col_1中当它们等于4时将值更改为5:

df.loc[df['col_1']==4, ['col_1']] = 5
vs3odd8k

vs3odd8k3#

这是不可能的,也是不可取的。
对此的解释在于电子表格和pandas DataFrames之间的差异。
在电子表格程序中,可以明确引用单元格,Sheet 1中的C3始终是Sheet 1中的C3。
然而,在pandas DataFrame中,许多操作返回输入的副本,这意味着现在您想要引用哪个“Cell”变得不明确。
例如,让我们假设您可以使用set my_cell = df.at[row_num, header]

set my_cell = df.at[row_num, header]
df_copy = df.copy()
df = df * 2
my_cell = 5

这里应该更新什么?原始对象,仍然由df_copy引用?还是在df = df * 2中重新分配给df的新对象?
这种模糊性将使它成为一个问题和错误的来源,而不是一个有用的工具。

解决方法:标签词典

如果真实的问题是,如果代码中的多个位置发生变化,您不想更新这些位置的索引,那么解决方法可能是使用标签字典->索引。定义索引一次,然后使用标签:

df = pd.DataFrame({'A': [1, 2, 3],
                   'B': [4, 5, 6]
                  })

labels = {'my_cell': (0, 'A'), 'my_other_cell': (2, 'B')}

df.loc[labels['my_cell']] = 9

   A  B
0  9  4
1  2  5
2  3  6

相关问题