cal*_*ben 10 python numpy pandas
从Pandas数据帧中选择数据时,有时会返回一个视图,有时会返回一个副本.虽然这背后有一个逻辑,有没有办法强制Pandas 显式返回视图或副本?
您的问题分为两部分:(1)如何制作视图(请参阅本答案的底部),以及(2)如何制作副本.
我将用一些示例数据演示:
import pandas as pd
df = pd.DataFrame([[1,2,3],[4,5,6],[None,10,20],[7,8,9]], columns=['x','y','z'])
# which looks like this:
x y z
0 1 2 3
1 4 5 6
2 NaN 10 20
3 7 8 9
Run Code Online (Sandbox Code Playgroud)
如何制作副本:一种选择是在执行任何操作后显式复制DataFrame.例如,假设我们选择的是没有NaN的行:
df2 = df[~df['x'].isnull()]
df2 = df2.copy()
Run Code Online (Sandbox Code Playgroud)
然后,如果您修改df2中的值,您将发现修改不会传播回原始数据(df),并且Pandas不会警告"正在尝试在DataFrame的切片副本上设置值" "
df2['x'] *= 100
# original data unchanged
print(df)
x y z
0 1 2 3
1 4 5 6
2 NaN 10 20
3 7 8 9
# modified data
print(df2)
x y z
0 100 2 3
1 400 5 6
3 700 8 9
Run Code Online (Sandbox Code Playgroud)
注意:您可以通过明确复制来降低性能.
如何忽略警告:或者,在某些情况下,您可能不关心是否返回视图或副本,因为您的目的是永久修改数据并且永远不会返回原始数据.在这种情况下,您可以取消警告并快速前进(只是不要忘记您已将其关闭,并且原始数据可能会或可能不会被您的代码修改,因为df2可能会也可能不会是副本):
pd.options.mode.chained_assignment = None # default='warn'
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅如何处理Pandas中的SettingWithCopyWarning的答案?
如何制作视图:熊猫会随时随地隐式地制作视图.关键是使用该df.loc[row_indexer,col_indexer]方法.例如,要将列的值乘以y100仅适用于column x不为null 的行,我们将编写:
mask = ~df['x'].isnull()
df.loc[mask, 'y'] *= 100
# original data has changed
print(df)
x y z
0 1.0 200 3
1 4.0 500 6
2 NaN 10 20
3 7.0 800 9
Run Code Online (Sandbox Code Playgroud)