pandas 在一个数组中,loc的作用是什么?

rn0zuynd  于 2023-11-15  发布在  其他
关注(0)|答案(4)|浏览(116)

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

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。

f8rj6qna

f8rj6qna1#

不同之处在于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

vd2z7a6w

vd2z7a6w2#

使用.loc在复杂的操作中通常更好,但也是为了清晰。例如:

  • 如果索引涉及行标签和列标签,.loc使代码更具可读性和一致性。
  • 当您使用以数字命名的列时,
  • 此外,当您要为特定单元格赋值时,
  • 链式索引
  • 可读性
mzsu5hc0

mzsu5hc03#

在选择列时,这两个选项是等效的,但第一个选项通常更简洁,通常用于简单的列选择任务。第二个选项使用.loc,当您需要显式指定行和列时,或者当您想要应用更复杂的选择条件时,可能更有用。

yc0p9oo0

yc0p9oo04#

没有效果以上,据我所知. .loc是有用的,当你想选择特定的行.

相关问题