Eu tenho o seguinte dataframe, cr_df, que mostra a taxa em que ID1 converte em ID2
Taxa de Conversão ID2 ID2 0 1 A 0,046562 1 1 B 0,315975 2 1 C 0,577998 3 1 D 0,059465 4 2 A 0,6 5 2 B 0,4
Então eu tenho outro dataframe, raw_df, no formato de ID1, como:
Valor ID1 0 1 100 1 2 200
Meu objetivo é produzir um dataframe final_df, no formato ID2 que se pareça com algo como:
Valor ID2 0 C 100 1 a 200
Onde o mapeamento do ID1 consiste em selecionar um valor aleatório entre 0 e 1 e escolher o ID2 com base nas taxas de conversão.
Como posso conseguir isso nos pandas? (Eu preciso usar .apply?)
Respostas:
1 para resposta № 1Dada esta configuração:
import numpy as np
import pandas as pd
df = pd.DataFrame({
"ID1": [1]*4+[2]*2, "ID2":list("ABCDAB"),
"Conversion Rate": [0.046562, 0.315975, 0.577998, 0.059465, 0.6, 0.4]})
raw_df = pd.DataFrame({"ID1": [1,2], "Value":[100, 200]})
você poderia definir uma função random_id2
:
def random_id2(x):
return np.random.choice(x["ID2"], p=x["Conversion Rate"].values)
E use groupby/apply
:
id2 = df.groupby(["ID1"]).apply(random_id2)
para obter a série
ID1
1 C
2 A
dtype: object
Você poderia então construir final_df
mapeando raw_df["ID1"]
valores para id2
valores:
final_df = raw_df.copy()
final_df["ID1"] = final_df["ID1"].map(id2)
final_df = final_df.rename(columns={"ID1": "ID2"})
import numpy as np
import pandas as pd
df = pd.DataFrame({
"ID1": [1]*4+[2]*2, "ID2":list("ABCDAB"),
"Conversion Rate": [0.046562, 0.315975, 0.577998, 0.059465, 0.6, 0.4]})
raw_df = pd.DataFrame({"ID1": [1,2], "Value":[100, 200]})
def random_id2(x):
return np.random.choice(x["ID2"], p=x["Conversion Rate"].values)
id2 = df.groupby(["ID1"]).apply(random_id2)
final_df = raw_df.copy()
final_df["ID1"] = final_df["ID1"].map(id2)
final_df = final_df.rename(columns={"ID1": "ID2"})
print(final_df)
rendimentos
ID2 Value
0 C 100
1 A 200
1 para resposta № 2
Você pode fazer uma combinação dos seguintes itens:
Para fazer uma escolha aleatória ponderada das linhas, use a resposta em essa questão; especificamente, fazer uma seleção ponderada de
range(len(df))
com os pesos dados pordf[Conversion Rate]
.Para selecionar as linhas com os índices fornecidos, consulte Aqui.
Para unir o dataframe resultante com o segundo, use
merge