我有以下数据帧cr_df,它显示ID1转换为ID2的速率
ID1 ID2 Conversion Rate 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
然后我有另一个数据帧raw_df,格式为ID1,如:
ID1 Value 0 1 100 1 2 200
我的目标是以ID2格式输出数据帧final_df,如下所示:
ID2 Value 0 C 100 1 A 200
ID1的映射包括选择0到1之间的随机值,并根据转换率选择ID2。
我怎样才能在熊猫中实现这一目标? (我需要使用.apply吗?)
答案 0 :(得分:1)
您可以执行以下操作的组合:
要对行进行加权随机选择,请使用https://msdn.microsoft.com/en-us/library/ex21zs8x%28v=vs.110%29.aspx中的答案;具体而言,使用range(len(df))
给出的权重对df[Conversion Rate]
进行加权选择。
要选择具有给定索引的行,请参阅this question。
要将结果数据框与第二个数据框合并,请使用here
答案 1 :(得分:1)
鉴于此设置:
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]})
你可以定义一个函数random_id2
:
def random_id2(x):
return np.random.choice(x['ID2'], p=x['Conversion Rate'].values)
并使用groupby/apply
:
id2 = df.groupby(['ID1']).apply(random_id2)
获取系列
ID1
1 C
2 A
dtype: object
然后,您可以通过将final_df
值映射到raw_df['ID1']
值来构建id2
:
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)
产量
ID2 Value
0 C 100
1 A 200