【发布时间】:2022-01-27 01:09:12
【问题描述】:
问题
.loc 是否根据上下文同时生成视图和副本?
背景
对 pandas .loc 的行为有点困惑,因为我认为它应该生成一个视图。但是,它看起来会在下面的示例中生成一个副本。
import numpy as np
import pandas as pd
df_for_view = pd.DataFrame(np.random.choice(10, (3, 5)), columns=list('ABCDE'))
back_for_view = df_for_view
print(back_for_view)
---
A B C D E
0 1 5 3 7 3
1 3 3 8 3 2
2 1 7 6 8 4
使用生成副本的.loc。
df_for_view = df_for_view.loc[:, ['B']]
print(df_for_view.values.base is back_for_view.values.base)
---
False # <--- .loc has generated a copy because the base is different
更新生成的.loc不反映。
df_for_view.loc[:, :] = -1
print(back_for_view)
---
A B C D E
0 1 5 3 7 3
1 3 3 8 3 2
2 1 7 6 8 4
另一方面,如果更新赋值发生在同一行,它看起来.loc生成了一个视图。
df_for_view = pd.DataFrame(np.random.choice(10, (3, 5)), columns=list('ABCDE'))
back_for_view = df_for_view
print(f"df_for_view is \n{df_for_view}\n")
print("updating...")
df_for_view.loc[:, ['B']] = -1
print(f"df_for_view is \n{df_for_view}\n")
print(f"back_for_view is \n{back_for_view}\n")
print(df_for_view.values.base is back_for_view.values.base)
print(df_for_view.loc[:, ['B']].values.base is back_for_view.values.base)
结果:
df_for_view is
A B C D E
0 7 7 0 5 1
1 7 3 7 3 6
2 3 0 5 4 8
updating...
df_for_view is
A B C D E
0 7 -1 0 5 1
1 7 -1 7 3 6
2 3 -1 5 4 8
back_for_view is
A B C D E
0 7 -1 0 5 1
1 7 -1 7 3 6
2 3 -1 5 4 8
True
False
那么,.loc 生成视图或副本取决于它发生的上下文?
【问题讨论】: