Dado um DataFrame:
np.random.seed(0)
df = pd.DataFrame(np.random.randn(3, 3), columns=list('ABC'), index=[1, 2, 3])
df
A B C
1 1.764052 0.400157 0.978738
2 2.240893 1.867558 -0.977278
3 0.950088 -0.151357 -0.103219
Qual é a maneira mais simples de adicionar uma nova coluna contendo um valor constante, por exemplo, 0?
A B C new
1 1.764052 0.400157 0.978738 0
2 2.240893 1.867558 -0.977278 0
3 0.950088 -0.151357 -0.103219 0
Esta é a minha solução, mas não sei por que isso coloca NaN na coluna 'nova'.
df['new'] = pd.Series([0 for x in range(len(df.index))])
A B C new
1 1.764052 0.400157 0.978738 0.0
2 2.240893 1.867558 -0.977278 0.0
3 0.950088 -0.151357 -0.103219 NaN
df['new'] = pd.Series([0 for x in range(len(df.index))], index=df.index)
.[0] * len(df.index)
df['new'] = 0
Respostas:
A razão pela qual isso é
NaN
colocado em uma coluna é porquedf.index
e oIndex
de seu objeto do lado direito são diferentes. @zach mostra a maneira correta de atribuir uma nova coluna de zeros. Em geral,pandas
tenta fazer o máximo de alinhamento de índices possível. Uma desvantagem é que, quando os índices não estão alinhados, você obtém tudo oNaN
que eles não estão alinhados. Brinque com os métodosreindex
ealign
para obter alguma intuição sobre os trabalhos de alinhamento com objetos que possuem índices parcialmente, totalmente e não alinhados. Por exemplo, aqui está comoDataFrame.align()
funciona com índices parcialmente alinhados:fonte
Atribuição super simples no local:
df['new'] = 0
Para modificação no local, execute a atribuição direta. Esta tarefa é transmitida por pandas para cada linha.
Nota para colunas de objeto
Se você deseja adicionar uma coluna de listas vazias, aqui está o meu conselho:
object
colunas são más notícias em termos de desempenho. Repense como seus dados são estruturados.Se você precisar armazenar uma coluna de listas, certifique-se de não copiar a mesma referência várias vezes.
Gerando uma cópia:
df.assign(new=0)
Se você precisar de uma cópia, use
DataFrame.assign
:E, se você precisar atribuir várias dessas colunas com o mesmo valor, isso é tão simples como,
Atribuição de múltiplas colunas
Finalmente, se você precisar atribuir várias colunas com valores diferentes, você pode usar
assign
com um dicionário.fonte
Com os pandas modernos, você pode apenas fazer:
fonte
Aqui está outra linha usando lambdas (criar coluna com valor constante = 10)
antes
depois de
fonte
df['newCol'] = 10
também é um forro (e é mais rápido). Qual é a vantagem de usar aplicar aqui?df['new'] = [[] for _ in range(len(df))]