如果我有这个最小的可重现的例子

import pandas as pd
 
df = pd.DataFrame({"A":[12, 4, 5, None, 1],
                "B":[7, 2, 54, 3, None],
                "C":[20, 16, 11, 3, 8],
                "D":[14, 3, None, 2, 6]})
 
index_ = ['Row_1', 'Row_2', 'Row_3', 'Row_4', 'Row_5']
 
df.index = index_
print(df)

# Option 1
result = df[['A', 'D']]
print(result)

# Option 2
result = df.loc[:, ['A', 'D']]
print(result)

使用loc和不使用loc有什么影响?结果非常相似. 我问这个问题是为了准备一个更复杂的问题,在这个问题中,我被指示使用loc.

推荐答案

不同的是,df[['A', 'D']]是对df(这里指的是Pandas 2.1.2)的微弱引用.

result1 = df[['A', 'D']]
print(result1._is_copy)
#<weakref at 0x7f34261b69d0; to 'DataFrame' at 0x7f34260e9590>

result2 = df.loc[:, ['A', 'D']]
print(result2._is_copy)
# None

在这两种情况下,这都不是一种观点:

print(result1._is_view, result2._is_view)
# False False

这种行为随着Pandas 版本的不同而改变.

这很重要吗?

这取决于你想做什么.在大多数情况下,不是.

然而,在特定情况下,第一种方法可以触发SettingWithCopyWarning:

result1 = df[['A', 'D']]
s1 = result1['A']
s1[:] = 1
# SettingWithCopyWarning: 
# A value is trying to be set on a copy of a slice from a DataFrame

result2 = df.loc[:, ['A', 'D']]
s2 = result2['A']
s2[:] = 1
# no Warning

Python相关问答推荐

如何让 turtle 通过点击和拖动来绘制?

try 与gemini-pro进行多轮聊天时出错

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

如何制作10,000年及以后的日期时间对象?

用Python解密Java加密文件

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

如何在给定的条件下使numpy数组的计算速度最快?

如何在Polars中从列表中的所有 struct 中 Select 字段?

创建可序列化数据模型的最佳方法

如何启动下载并在不击中磁盘的情况下呈现响应?

判断solve_ivp中的事件

使用Python查找、替换和调整PDF中的图像'

如何在Pyplot表中舍入值

如何将数据帧中的timedelta转换为datetime

用SymPy在Python中求解指数函数

关于两个表达式的区别

在Google Drive中获取特定文件夹内的FolderID和文件夹名称

如果包含特定值,则筛选Groupby

Beautifulsoup:遍历一个列表,从a到z,并解析数据,以便将其存储在pdf中.

在电影中向西北方向对齐""