Ive заметил, что назначение на pandas
DataFrame
колонок ( с использованием .loc
индексатора) ведет себя по- разному в зависимости от того, каких других столбцов присутствуют в DataFrame
и точной форме задания. Используя три примера DataFrame
s:
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]])
Ive нашел следующее:
-
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
-
Таким образом, кажется, что df.loc
ведет себя по-другому, если один из других столбцов в DataFrame
не имеет object
dtype.
Мой вопрос:
- Почему присутствие других столбцов имеет значение в этом назначении?
- Почему разные версии задания не эквивалентны? В частности, почему результат в случаях, которые не приводят к
ValueError
что столбецDataFrame
заполняется значениями первого столбца массиваnumpy
?
Примечание. Мне не интересно обсуждать, имеет ли смысл назначать столбец массиву numpy
таким образом. Я только хочу знать о различиях в поведении и может ли это считаться ошибкой.