TL;DR:使用.loc[:, 'foo']
而不是.foo
大熊猫什么时候给视图赋值,什么时候给副本赋值?
AFAIK,熊猫要么返回视图,要么复制,这取决于你使用的方法。
如果将值赋值给视图,则可以更改原始数据,但如果将值分配给副本,则不能更改原始数据。
然而,下面的行为让我感到困惑。为什么将值赋值给视图使用的是dataframe,而不是系列呢?
dd = pd.DataFrame([
{'a': 1, 'b': 2},
{'a': 2, 'b': 4},
{'a': 4, 'b': 3},
])
dd[dd.a == 1] = pd.DataFrame([{'a': 100, 'b': 200}]) # Assigning value works.
dd
>> a b
0 100 200
1 2 4
2 4 3
正如预期的那样,第一行的值已经更改。
但是,如下所示,将一个值分配给一个系列并不起作用,甚至认为设置是相同的,只是我调用了一个序列。
dd = pd.DataFrame([
{'a': 1, 'b': 2},
{'a': 2, 'b': 4},
{'a': 4, 'b': 3},
])
dd[dd.a == 1].a = 1000 # Assigning value doesn't work.
dd
>> a b
0 1 2
1 2 4
2 4 3
不过,我在看熊猫0.19.1。(因为我使用Python 2.7)
发布于 2020-08-27 02:13:20
TLDR;
我想你自己已经回答了你的问题。将值赋值给视图将按照您预期的方式进行,而将值分配给副本不会修改原始数据帧。
本质上;
dd[dd.a == 1].a
是来自dataframedd.a[dd.a == 1]
切片的值的副本,是同一数据帧的另一个切片(df.a)的一个切片(按条件)的视图。下面是dataframe dd
的一个条件片段,因此它是dataframe的视图。与loc
类似,这是推荐的方法。
dd[dd.a == 1] #Slice of a dataframe based on condition returned as a view
dd.loc[dd.a == 1] #Slice of a dataframe based on condition returned as a view
当你从这个切片中提取一个特定的列时,你最终会得到一个拷贝-
dd[dd.a == 1].a = 100
#This syntax basically says -
#From the view of a slice of dd, give me values of 'a' and set that to 100"
#The assignment here is that to a copy and not to a view
a b
0 1 2
1 2 4
2 4 3
因此,分配将不会影响原始数据。
如果你想为某一列做分配,那么你需要这样做-
dd.a[dd.a == 1] = 100
#This syntax basically says -
#"From the slice, dd.a give me aother slice based on condition and set that slice to 100"
#The assignment happens a sliced view of the dataframe itself
a b
0 100 2
1 2 4
2 4 3
希望这能回答你的问题。
https://stackoverflow.com/questions/63613370
复制