【问题标题】:Random sampling and Pandas dataframes随机抽样和 Pandas 数据帧
【发布时间】:2015-08-16 12:55:53
【问题描述】:

我有以下数据帧 cr_df,它显示了 ID1 转换为 ID2 的速率

ID1 ID2 转化率 0 1 一个 0.046562 1 1 B 0.315975 2 1 C 0.577998 3 1 D 0.059465 4 2 0.6 5 2 乙 0.4

然后我还有另外一个dataframe,raw_df,格式为ID1如:

ID1 值 0 1 100 1 2 200

我的目标是输出一个 dataframe final_df,其 ID2 格式类似于:

ID2 值 0℃ 100 1 A 200

其中来自 ID1 的映射包括选择 0 到 1 之间的随机值并根据转化率选择 ID2。

如何在 pandas 中实现这一点? (我需要使用 .apply 吗?)

【问题讨论】:

    标签: python pandas


    【解决方案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
    

    然后您可以通过将raw_df['ID1'] 值映射到id2 值来构建final_df

    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
    

    【讨论】:

      【解决方案2】:

      您可以执行以下组合:

      • 要对行进行加权随机选择,请使用this question 中的答案;具体来说,使用df[Conversion Rate] 给出的权重对range(len(df)) 进行加权选择。

      • 要选择具有给定索引的行,请参阅here

      • 要将生成的数据帧与第二个数据帧连接,请使用merge

      【讨论】:

        猜你喜欢
        • 2014-06-22
        • 2019-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-31
        • 2018-09-12
        • 2017-10-15
        相关资源
        最近更新 更多