使用iloc复制的熊猫不能按预期工作

时间:2014-06-25 22:39:48

标签: python pandas

我对大熊猫比较新,所以我希望我还没有完全掌握它。我一直试图复制一个数据帧,我需要按照外部提供的映射重新排序行(这是将df2设置为nan的一个很好但不相关的原因)。当我尝试使用.iloc作为一个操作时,会忽略排序,但如果我循环并一次执行一行,它就像我预期的那样工作。任何人都可以解释我在这个MWE中出错的地方吗? (此外,欢迎采用更有效/更优雅的方式)。

import pandas as pd
import numpy as np

df1 = pd.DataFrame([[100,200,300,400]]).T
df1.columns = ['A']

df2 = df1.copy()
df2[:] = np.nan

assign = np.array([[0,0],[1,1],[3,2],[2,3]])

print df1

# This does not work:
# df2.iloc[assign[:,1]] = df1.iloc[assign[:,0]]
# Output:
#      A
# 0  100
# 1  200
# 2  300
# 3  400
#
#      A
# 0  100
# 1  200
# 2  300
# 3  400

# This does:
for x in assign:
  df2.iloc[x[1]] = df1.iloc[x[0]]
# Output:
#      A
# 0  100
# 1  200
# 2  300
# 3  400
#
#      A
# 0  100
# 1  200
# 2  400
# 3  300

print df2

1 个答案:

答案 0 :(得分:2)

我们需要一位pandas开发人员来解释为什么这是它的工作方式,但我知道以下解决方案可以帮助您(pandas 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] 

正如@Jeff指出的那样,在df2.iloc[assign[:,1]] = df1.iloc[assign[:,0]]中,您正在为Series分配Series,并且两个索引将匹配。但是对于df2.iloc[assign[:,1]] = df1.iloc[assign[:,0]].values,您要为array分配Series,并且没有要匹配的索引。

另请考虑以下示例,作为索引匹配行为的说明。

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)