/ / Pandas dataframe cria nova coluna baseada na lista de tuplas - python, pandas, dataframe, python-3.4

O dataframe do Pandas cria uma nova coluna com base na lista de tuplas - python, pandas, dataframe, python-3.4

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 № 1

Você 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])