您的问题分为两个部分:(1)如何制作视图(请参见本答案的底部),以及(2)如何制作副本。
我将用一些示例数据进行演示:
import pandas as pddf = pd.Dataframe([[1,2,3],[4,5,6],[None,10,20],[7,8,9]], columns=['x','y','z'])# which looks like this: x y z0 1 2 31 4 5 62 NaN 10 203 7 8 9
如何进行复制: 一种选择是在执行任何 *** 作后显式复制Dataframe。例如,假设我们正在选择不包含NaN的行:
df2 = df[~df['x'].isnull()]df2 = df2.copy()
然后,如果您修改df2中的值,您会发现修改不会传播回原始数据(df),而熊猫也不会警告“正在尝试从Dataframe的切片副本上设置值”
df2['x'] *= 100# original data unchangedprint(df) x y z0 1 2 31 4 5 62 NaN 10 203 7 8 9# modified dataprint(df2) x y z0 100 2 31 400 5 63 700 8 9
注意:您可能需要通过显式地制作副本来降低性能。
如何忽略警告:
或者,在某些情况下,您可能不关心是否返回视图或副本,因为您的意图是永久修改数据,而从不返回原始数据。在这种情况下,您可以禁止显示警告,并且可以轻松处理(只是不要忘记已将其关闭,并且代码可能会或可能不会修改原始数据,因为df2可能会或可能不会)副本):
pd.options.mode.chained_assignment = None # default='warn'
有关更多信息,请参见如何处理Pandas中的SettingWithCopyWarning?
如何制作视图:
无论何时何地,Pandas都会隐式创建视图。关键是要使用该
df.loc[row_indexer,col_indexer]方法。例如,
y仅对column
x不为null的行将column的值乘以100
,我们可以这样写:
mask = ~df['x'].isnull()df.loc[mask, 'y'] *= 100# original data has changedprint(df) x y z0 1.0 200 31 4.0 500 62 NaN 10 203 7.0 800 9
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)