Python 使用iloc进行复制时未按预期工作

Python 使用iloc进行复制时未按预期工作,python,pandas,Python,Pandas,我对熊猫比较陌生,所以我想我还没有完全掌握它。我一直在尝试创建一个数据帧的副本,我需要按照外部提供的映射对行进行重新排序(将df2设置为nan有一个很好但不相关的原因)。当我尝试使用.iloc将其作为一个操作来执行时,排序被忽略,但是如果我循环并一次执行一行,它将按照我的预期工作。有人能解释一下我在这个MWE中的错误吗?(此外,欢迎采用更高效/优雅的方式) 我们需要一位pandas开发人员来解释为什么它是这样工作的,但我知道下面的解决方案将使您达到目的(pandas 0.13.1): 正如@Je

我对熊猫比较陌生,所以我想我还没有完全掌握它。我一直在尝试创建一个数据帧的副本,我需要按照外部提供的映射对行进行重新排序(将df2设置为nan有一个很好但不相关的原因)。当我尝试使用.iloc将其作为一个操作来执行时,排序被忽略,但是如果我循环并一次执行一行,它将按照我的预期工作。有人能解释一下我在这个MWE中的错误吗?(此外,欢迎采用更高效/优雅的方式)


我们需要一位
pandas
开发人员来解释为什么它是这样工作的,但我知道下面的解决方案将使您达到目的(
pandas 0.13.1
):

正如@Jeff所指出的,在
df2.iloc[assign[:,1]]=df1.iloc[assign[:,0]]
中,您将
系列
分配给
系列
,两个索引将匹配。但是使用
df2.iloc[assign[:,1]]=df1.iloc[assign[:,0]]值
,您将
数组
分配给
系列
,并且没有要匹配的索引

还考虑下面的示例,作为索引匹配行为的说明。

In [208]:
#this will work and there will be missing values
df1['B']=pd.Series({0:'a', 3:'b', 2:'c'})
print df1
     A    B
0  100    a
1  200  NaN
2  300    c
3  400    b

[4 rows x 2 columns]
In [209]:
#this won't work
df1['B']=['a', 'b', 'c'] #one element less than df1
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

分配时,rhs将自动与lhs对齐,也就是说,将拾取匹配的标签。这是一个功能!在这个解决方案中,你只是分配值(一个numpy数组),所以它们没有什么需要对齐的(在这个例子中,这就是你想要的)嘿@Jeff,很好的解释。我知道你在用移动设备打字,干杯!嘿,CT,我想你是说熊猫版本0.13.1。太棒了,谢谢你的解释!这对我来说真的很清楚。
In [179]:
df2.iloc[assign[:,1]] = df1.iloc[assign[:,0]].values
print df2

out[179]:
     A
0  100
1  200
2  400
3  300

[4 rows x 1 columns] 
In [208]:
#this will work and there will be missing values
df1['B']=pd.Series({0:'a', 3:'b', 2:'c'})
print df1
     A    B
0  100    a
1  200  NaN
2  300    c
3  400    b

[4 rows x 2 columns]
In [209]:
#this won't work
df1['B']=['a', 'b', 'c'] #one element less than df1
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)