pandas的链式索引

Posted

技术标签:

【中文标题】pandas的链式索引【英文标题】:chain indexing of pandas 【发布时间】:2021-08-04 18:08:41 【问题描述】:

根据下面的文章,view 共享内存,所以无论警告信息如何,都必须更改原始数据。

df["b":"d"]["z"] = 0

这反映了您目前在文章中看到的行为。 df["b":"d"] 返回一个视图并允许您修改原始数据。这就是赋值 df["b":"d"]["z"] = 0 成功的原因。请注意,在这种情况下,无论是否成功更改 df,您都会收到 SettingWithCopyWarning。

https://realpython.com/pandas-settingwithcopywarning/#impact-of-data-types-on-views-copies-and-the-settingwithcopywarning

如果范围切片(iloc[0:2]) 应用于所有整数列的数据框,则返回视图。视图需要修改C列,但是在下面的例子中不起作用..

data = np.arange(9).reshape(3, 3)
index = ["1/1", "1/2", "1/3"]
columns = ["A", "B", "C"]

df = DataFrame( data, index, columns)
df.iloc[0:2]['C'] = 1000
print(df)
     A  B  C
1/1  0  1  2
1/2  3  4  5
1/3  6  7  8

我不确定与文章中的解释有什么不同。

【问题讨论】:

这是一个已知问题,还有很多边缘情况No SettingWithCopyWarning for chained indexing when .loc or .iloc is first indexer 【参考方案1】:

有循环,可以改变它。

data = np.arange(9).reshape(3, 3)
index = ["1/1", "1/2", "1/3"]
columns = ["A", "B", "C"]

df = pd.DataFrame(data, index, columns)
for i in range(len(index)):
    df.iloc[i]["C"] = 1000
print(df)

【讨论】:

您的回答与问题无关。供您参考,使用df.loc[:, 'C'] = 1000 比使用链索引更好。

以上是关于pandas的链式索引的主要内容,如果未能解决你的问题,请参考以下文章

熊猫:链式作业[重复]

从无到有算法养成篇-链式存储结构之循环链表

链式法则

jQuery链式操作如何实现以及为啥要用链式操作

JQuery的链式编程,隐式迭代是什么意思

链式队列(Linked Queue)