2 回答
TA贡献1804条经验 获得超3个赞
我尝试测试如何在链式赋值中重写值与 .loc 参考上面@Quang Hoang 共享的 pandas 文档链接。
这是我试过的:
dfmi = pd.DataFrame([list('abcd'),
list('efgh'),
list('ijkl'),
list('mnop')],
columns=pd.MultiIndex.from_product([['one', 'two'],
['first', 'second']]))
df1 = dfmi['one']['second']
df2 = dfmi.loc[:, ('one', 'second')]
df1 和 df2 的输出:
0 b
1 f
2 j
3 n
迭代 1:
value = ['z', 'x', 'c', 'v']
dfmi['one']['second'] = value
输出 df1:
0 z
1 x
2 c
3 v
迭代 2:
value = ['z', 'x', 'c', 'v']
dfmi.loc[:, ('one', 'second')] = value
输出 df2:
0 z
1 x
2 c
3 v
在这两种情况下,新集合的分配都会改变值。
文件说:
引用 1:“方法 2 (.loc) 比方法 1 (chained []) 更受欢迎”
引用 2:'在简单情况之外,很难预测“ getitem ”(由链式选项使用)是否会返回视图或副本(这取决于数组的内存布局,pandas 对此不做任何保证),因此,“ setitem ”(由 .loc 使用)是否会修改 dfmi 或随后立即被丢弃的临时对象。
我无法理解上面的解释。如果 dfmi 中的值可以改变(在我的情况下)并且可能不会改变(就像在 Benoit 的情况下)那么通过哪种方式获得结果?不确定我是否遗漏了一点。寻求帮助
TA贡献1816条经验 获得超4个赞
切片没有反映您在原始数据框中所做的更改的原因是 b/c 您首先创建了切片。
创建切片时,您创建了数据切片的“副本”。您没有直接将两者联系起来。
这里的简短回答是,您有两个选择 1) 首先更改原始 df,然后创建一个切片 2) 不切片,只需使用 .loc 或 iloc 引用原始 df 进行操作
添加回答
举报
