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