gpt4 book ai didi

python - Pandas 就位 self 。变量

转载 作者:行者123 更新时间:2023-12-04 09:00:31 28 4
gpt4 key购买 nike

import pandas as pd

df = pd.DataFrame([[1, 'li'], [2, 'la'], [3, 'lu']], columns=(['index', 'col']))


class Test:
def __init__(self, data):
self.data = data
self.data.set_index('index', inplace = True)


test1 = Test(df)
test2 = Test(df)

print(test1.data)
print(test2.data)
这会引发一个错误: KeyError: "None of ['index'] are in the columns"
我意识到使用 set_index()inplace = True__init__方法不操作 self.data属于对象实例的变量。它实际上设置了 data作为所有实例共享的类变量。
当我避免使用 inplace我没有收到错误,因为现在 self.data设置对象实例的变量。
import pandas as pd

df = pd.DataFrame([[1, 'li'], [2, 'la'], [3, 'lu']], columns=(['index', 'col']))


class Test:
def __init__(self, data):
self.data = data
self.data = self.data.set_index('index', inplace=False)


test1 = Test(df)
test2 = Test(df)

print(test1.data)
print(test2.data)
输出:
       col
index
1 li
2 la
3 lu
col
index
1 li
2 la
3 lu
这种行为的原因是什么?对我来说,在以 .self 开头的变量上使用函数时设置类变量似乎有点违反直觉。
使用 inplace = True 是否有理由或优势? ?

最佳答案

我不认为它与 Pandas 有关,而更多地与 Python 是一种传递对象引用语言 ( see explanations here ) 的事实有关。
考虑以下与您的示例具有类似行为的示例:

class Test2:
def __init__(self, data):
self.data = data
self.data.append(2)

A=[0,1]
test1 = Test2(A)
print(A)
输出:
[0, 1, 2]
对底层对象的修改 A被持久化(因为它是一个列表,并且列表是可变的,就像 Pandas 数据帧一样)。
在您的示例中,使用 self.data.set_index('index', inplace = True) 时一个新的数据框不会被创建,与上面的例子类似,底层对象 df被坚持。
考虑对您的代码添加以下内容:
import pandas as pd

df = pd.DataFrame([[1, 'li'], [2, 'la'], [3, 'lu']], columns=(['index', 'col']))

class Test:
def __init__(self, data):
self.data = data
self.data.set_index('index', inplace = True)


print(df.columns)
test1 = Test(df)
print(df.columns)
输出:
Index(['index', 'col'], dtype='object')
Index(['col'], dtype='object')
df被改变了。
最后,以下将起作用:
import pandas as pd

df = pd.DataFrame([[1, 'li'], [2, 'la'], [3, 'lu']], columns=(['index', 'col']))

class Test:
def __init__(self, data):
self.data = data
self.data.set_index('index', inplace = True)

test1 = Test(pd.DataFrame([[1, 'li'], [2, 'la'], [3, 'lu']], columns=(['index', 'col'])))
test2 = Test(pd.DataFrame([[1, 'li'], [2, 'la'], [3, 'lu']], columns=(['index', 'col'])))

print(test1.data)
print(test2.data)

关于python - Pandas 就位 self 。变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63581914/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com