熊猫使用另一部分分配数据框的一部分

时间:2020-10-25 14:25:23

标签: python pandas

大约一年前,我从R转到python,但有时我仍然觉得熊猫难以理解。这是一个示例:

import pandas as pd
a = pd.DataFrame(dict(x = [1,2,3], y = [4,5,6], z = [7,8,9]))
a
Out[34]: 
   x  y  z
0  1  4  7
1  2  5  8
2  3  6  9

我要替换这部分:

a.loc[a.x>1, "y":]
Out[35]: 
   y  z
1  5  8
2  6  9

与此部分:

a.loc[a.x<3, 'x':"y"]
Out[36]: 
   x  y
0  1  4
1  2  5

所以我试图做到这一点:

a.loc[a.x>1, "y":] = a.loc[a.x<3, 'x':"y"]

但是我明白了:

a
Out[38]: 
     x    y    z
0  1.0  4.0  7.0
1  2.0  5.0  NaN
2  3.0  NaN  NaN

该死的。我猜这与索引编制有关系吗?

当我将要转换的部分转换为numpy数组时,它起作用:

a.loc[a.x>1, "y":] = np.array(a.loc[a.x<3, 'x':"y"])

a
Out[44]: 
   x  y  z
0  1  4  7
1  2  1  4
2  3  2  5

大概是因为这会丢弃使我绊倒的所有元数据。

我有两个问题:

  1. 这里的熊猫行为背后的原理是什么?对我来说似乎有点晦涩难懂,但是我的期望是由我在R(以及之前的Matlab)的背景决定的,很可能有充分的理由。

  2. 更具体地说:做我正在尝试的潘多尼克方式是什么?

1 个答案:

答案 0 :(得分:2)

您的问题最好用图片来表示:

enter image description here

红色正方形是您通过.loc检索的视图,它返回一个视图,蓝色正方形是您为其分配值的视图。由于pandas是基于index的,并且唯一的重叠值是5,所以红色正方形中的其余值都用NaN填充。

您可以通过a.loc[a.x<3, 'x':"y"].valuesa.loc[a.x<3, 'x':"y"].to_numpy()分配不带索引的值。