2016-08-31 3 views
5

имея dataframe, я хочу, чтобы обновить подмножество столбцов с серией такой же длины, как число столбцов обновляется:обновление dataframe с серии

>>> df = pd.DataFrame(np.random.randint(0,5,(6, 2)), columns=['col1','col2']) 
>>> df 

    col1 col2 
0  1  0 
1  2  4 
2  4  4 
3  4  0 
4  0  0 
5  3  1 

>>> df.loc[:,['col1','col2']] = pd.Series([0,1]) 
... 
ValueError: shape mismatch: value array of shape (6,) could not be broadcast to indexing result of shape (2,6) 

это терпит неудачу, однако, я могу сделать то же самое вещь используя список:

>>> df.loc[:,['col1','col2']] = list(pd.Series([0,1])) 
>>> df 
    col1 col2 
0  0  1 
1  0  1 
2  0  1 
3  0  1 
4  0  1 
5  0  1 

не могли бы вы помочь мне понять, почему обновление с помощью серийных сбоев? мне нужно выполнить какую-то конкретную перестройку?

ответ

3

При назначении с помощью объекта pandas панды трактуют назначение более «строго». Назначение pandas to pandas должно проходить более строгие протоколы. Только когда вы включаете его в список (или, что то же самое, pd.Series([0, 1]).values), панды сдаются и позволяют вам назначать так, как вы думаете, он должен работать.

Этот высокий стандарт назначения требует, чтобы индексы выстраивались в линию, так что даже если бы у вас была правильная форма, она все равно не работала бы без правильных индексов.

df.loc[:, ['col1', 'col2']] = pd.DataFrame([[0, 1] for _ in range(6)]) 
df 

enter image description here

df.loc[:, ['col1', 'col2']] = pd.DataFrame([[0, 1] for _ in range(6)], columns=['col1', 'col2']) 
df 

enter image description here

+1

спасибо! когда вы говорите «панды сдаются», значит ли это, что такое назначение не рекомендуется вообще? есть ли лучший, «безопасный» способ? – kekert

+1

@kekert Нет! Не за что. Я был слишком свободен со словами. при назначении списком панды предполагают, что вы знаете, что делаете. Это очень полезная вещь, которую можно сделать. – piRSquared

+2

Возможно, есть чек, потому что если есть только 2 строки, он работает хорошо - 'df = pd.DataFrame (np.random.randint (0,5, (2, 2)), columns = ['col1', 'col2']) ',' df.loc [:, ['col1', 'col2']] = pd.Series ([0,1]) '+1 – jezrael