PythonNumpy:在V1.10.1中使用列表更新多个列失败
在0.16.2中,以下代码可以正常工作:PythonNumpy:在V1.10.1中使用列表更新多个列失败,python,pandas,Python,Pandas,在0.16.2中,以下代码可以正常工作: df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}, index=[0, 1, 2, 3])
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df1[['A','B']] = [[1,1,1,1],[2,2,2,2]]
df1
Out[149]:
A B C D
0 1 2 C0 D0
1 1 2 C1 D1
2 1 2 C2 D2
3 1 2 C3 D3
在0.17中,相同的代码返回以下错误:
ValueError: cannot copy sequence with size 2 to array axis with dimension 4
这是0.17版本的错误吗?有哪种解决方案可以同时适用于这两个版本
更新:
事实证明,这个问题是由努比而不是熊猫引起的。在numpy 1.09中,列表必须为[[1,1,1]、[2,2,2]],而在1.10.1中,列表必须为[[1,2]、[1,2]、[1,2]、[1,2]、[1,2]]才能执行此任务 根据@Swarm的评论
df1[['A','B']] = pd.np.array([[1,1,1,1],[2,2,2,2]]).T
通过将df1
投射到pd.np.array
>>> pd.np.array(df1[['A','B']])
array([['A0', 'B0'],
['A1', 'B1'],
['A2', 'B2'],
['A3', 'B3']], dtype=object)
注意形状是(4,2)
方法(1)
方法(2)
作为一个单行程序,请尝试以下操作:df1[['a','B']=[[1,2],[1,2],[1,2],[1,2]]。这适用于0.17,但不适用于0.16。2@Allen,我在
Python2
上用0.16.2进行了尝试,效果不错。它可能是numpy
的版本吗?我的是1.10.1谢谢,伙计们,原来问题是由numpy而不是熊猫引起的。在numpy 1.09中,列表必须是[[1,1,1,1],[2,2,2]],而在1.10.1中,列表必须是[[1,2],[1,2],[1,2],[1,2]]。。。对于Python3兼容性,您必须使用list(zip(…)
,我没有用Python3
尝试这一点,无论如何list(zip(…)
将产生相同的结果
In [12]:
A_values = [1,1,1,1]
B_values = [2,2,2,2]
df.assign(A = A_values , B = B_values)
Out[12]:
A B C D
0 1 2 C0 D0
1 1 2 C1 D1
2 1 2 C2 D2
3 1 2 C3 D3
import itertools
In [10]:
A_values = [1,1,1,1]
B_values = [2,2,2,2]
In [28]:
df1[['A','B']] = zip(A_values , B_values)
df1
Out[28]:
A B C D
0 1 2 C0 D0
1 1 2 C1 D1
2 1 2 C2 D2
3 1 2 C3 D3