Considere este dataframe:
In [0]: df = pd.DataFrame({"Num": [1, 2, 3, 4] * 5})
In [1]: len(df)
Out[1]: 20
Eu quero criar uma nova coluna com base na lista de tuplas: por exemplo:
In [2]: tup = [(1, 0), (2, 1), (3, 0), (4, 1)]
In [3]: len(tup)
Out[3]: 4
Onde df["Num"] ==
para o primeiro item da tupla, quero adicionar o segundo valor à nova coluna.
Este é o exemplo da saída desejada:
Num bin
0 1 0
1 2 1
2 3 0
3 4 1
4 1 0
5 2 1
6 3 0
...
19 4 1
Eu tentei este código para alcançar este resultado:
df["bin"] = [j for l in df["Num"] for i,j in tup if i == l]
O resultado é ok, mas recebi um aviso:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
Então, qual é a melhor approache para copiar valores para uma nova coluna de dataframe?
Respostas:
3 para resposta № 1Você pode usar uma abordagem all-Pandas; converta suas tuplas em um dataframe e mescle-as com os dados originais:
tuples_as_df = pd.DataFrame(tup, columns=["dummy","bin"])
df = df.merge(tuples_as_df, how="left", left_on="Num", right_on="dummy")
del df["dummy"] # The merge key, not needed anymore
# Num bin
#0 1 0
#1 2 1
#2 3 0
#3 4 1
#4 1 0
#5 2 1
#....
0 para resposta № 2
Não tenho certeza se isso é melhor, mas você pode colocar a tupla em um dicionário e usar applymap
:
tup = [(1, 0), (2, 1), (3, 0), (4, 1)]
d = {k:v for k,v in tup}
df["bin"] = df.applymap(lambda x: d[x])