【发布时间】:2019-02-04 09:55:11
【问题描述】:
我注意到分配给pandasDataFrame 列(使用.loc 索引器)的行为会有所不同,具体取决于DataFrame 中存在的其他列以及分配的确切形式。用三个例子DataFrames:
df1 = pandas.DataFrame({
'col1': [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
})
# col1
# 0 [1, 2, 3]
# 1 [4, 5, 6]
# 2 [7, 8, 9]
df2 = pandas.DataFrame({
'col1': [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
'col2': [[10, 20, 30], [40, 50, 60], [70, 80, 90]]
})
# col1 col2
# 0 [1, 2, 3] [10, 20, 30]
# 1 [4, 5, 6] [40, 50, 60]
# 2 [7, 8, 9] [70, 80, 90]
df3 = pandas.DataFrame({
'col1': [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
'col2': [1, 2, 3]
})
# col1 col2
# 0 [1, 2, 3] 1
# 1 [4, 5, 6] 2
# 2 [7, 8, 9] 3
x = numpy.array([[111, 222, 333],
[444, 555, 666],
[777, 888, 999]])
我发现了以下内容:
-
df1:-
df1.col1 = x结果:
df1 # col1 # 0 111 # 1 444 # 2 777 -
df1.loc[:, 'col1'] = x结果:
df1 # col1 # 0 111 # 1 444 # 2 777 -
df1.loc[0:2, 'col1'] = x结果:
# […] # ValueError: could not broadcast input array from shape (3,3) into shape (3)
-
-
df2:-
df2.col1 = x结果:
df2 # col1 col2 # 0 111 [10, 20, 30] # 1 444 [40, 50, 60] # 2 777 [70, 80, 90] -
df2.loc[:, 'col1'] = x结果:
df2 # col1 col2 # 0 111 [10, 20, 30] # 1 444 [40, 50, 60] # 2 777 [70, 80, 90] -
df2.loc[0:2, 'col1'] = x结果:
# […] # ValueError: could not broadcast input array from shape (3,3) into shape (3)
-
-
df3:-
df3.col1 = x结果:
df3 # col1 col2 # 0 111 1 # 1 444 2 # 2 777 3 -
df3.loc[:, 'col1'] = x结果:
# ValueError: Must have equal len keys and value when setting with an ndarray -
df3.loc[0:2, 'col1'] = x结果:
# ValueError: Must have equal len keys and value when setting with an ndarray
-
因此,如果 DataFrame 中的其他列之一没有 dtype object,df.loc 的行为似乎有所不同。
我的问题是:
- 为什么其他列的存在会对这种分配产生影响?
- 为什么不同版本的作业不等效?特别是,为什么在
ValueError不导致DataFrame列被numpy数组的第一列 的值填充的情况下的结果?李>
注意:我不想讨论以这种方式将列分配给numpy 数组是否有意义。我只想知道行为上的差异,以及这是否算作错误。
【问题讨论】:
-
抱歉,我不打算深入探讨这个问题,但我会说,根据我的经验,
pandas并不总是表现良好,如果你将数组喜欢放在DataFrame. -
@JohnE 我认为你有错误的印象。如果这种事情被记录为不被推荐/支持,那么我完全可以接受它可能显示的任何不稳定行为。不过,如果不是,我认为应该小心,以使 API 以尽可能一致和可预测的方式运行(最不惊讶等等)。因此,如果熊猫文档在任何时候都说“不要这样做”,我会立即接受带有链接的答案。我的观点是,应该可以直接找出是否值得追求这样的事情。
-
@Socob,您可能对this meta discussion 感兴趣。
-
Socob:我删除了我的评论,因为 jpp 在这里和元讨论中更好地解释了它。我不认为你做错了什么,这可能没有很好的文档记录(熊猫以没有很好的文档而闻名)。它更像是熊猫用户随着时间的推移学习的民间传说(通过阅读此处的问答)。 @jpp 这是一个很好的元讨论,我不知道你对我的回答有何看法,但我确实试图让它不仅仅是通用的,而是特定于 OP 试图做的事情。我与您一样,对最佳方法到底是什么感到困惑!
-
@JohnE,我很喜欢你的回答,我已经投了赞成票 :)
标签: python pandas numpy dataframe