【问题标题】:duplicate row values with the same row index具有相同行索引的重复行值
【发布时间】:2020-11-03 15:56:00
【问题描述】:

我需要创建一个样本数据框,如果行索引相同,它会重复(并且不会再次采样)。

nums = [0.1,0.3,0.7,0.5]

country  a   b   c   d 
USA     0.3 0.1 0.5 0.7
USA     0.3 0.1 0.5 0.7
Italy   0.1 0.5 0.7 0.3
UK      0.7 0.1 0.5 0.3
Uk      0.7 0.1 0.5 0.3
UK      0.7 0.1 0.5 0.3

我试过了:

for i in df.index:
    df.loc[i] = random.sample(nums)

但每一行都有不同的样本

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以获取每个国家/地区的行数,为每个国家/地区生成样本并使用reindex-repeat 策略 (this answer) 扩展样本。

    # get size
    df_out = df.groupby("country").size().to_frame("size")
    
    # generate sample for each country
    df_out[["a","b","c","d"]] = df_out.apply(lambda el: random.sample(nums, k=4), axis=1).to_list()
    
    # ***** Replace the above line with the following code *****
    # ***** If it didn't work (legacy pandas version?)***
    df_out = pd.concat(
        [df_out,
         pd.DataFrame([random.sample(nums, k=4) for i in range(len(df_out))],
                      columns=["a","b","c","d"],
                      index=df_out.index)
         ], axis=1)
    
    # repeat rows based on size
    df_out = df_out.reindex(df_out.index.repeat(df_out["size"])).reset_index()
    

    输出

    print(df_out)
      country  size    a    b    c    d
    0   Italy     1  0.5  0.3  0.1  0.7
    1      UK     2  0.3  0.5  0.7  0.3
    2      UK     2  0.3  0.5  0.7  0.3
    3     USA     2  0.7  0.1  0.3  0.1
    4     USA     2  0.7  0.1  0.3  0.1
    5      Uk     1  0.1  0.7  0.5  0.5   <- caused by typo in given data
    

    在 python 3.7、pandas 1.1.3、64 位 debian 10 操作系统上测试

    【讨论】:

    • df_out[["a","b","c","d"]] = df_out.apply(lambda el: random.sample(nums, k=4), axis=1) [Index(["a","b","c","d"], dtype='object')] 都在 [columns] 中
    • 请将 pandas 更新到最新版本。如果这不可能或不起作用,请改用解决方法(已编辑)。
    • 我得到“使用可迭代设置时必须具有相等的 len 键和值”
    • 对于df_out[["a"]] = df_out.apply(lambda el: random.sample(nums, k=4),我在“a”处得到值列表
    • 能否在您的帖子中提供完整的步骤(包括示例数据集,以可直接复制的形式,而不是打印结果)?还要指出您使用的是哪个版本的 python 和 pandas。
    【解决方案2】:

    你应该使用 groupby 函数,试试这个:

    df.groupby(df.index).first()
    

    示例:

    【讨论】:

    • 我得到了所有的 NaN 值。我的列移动到索引
    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 2017-01-31
    • 2017-03-02
    • 2017-08-09
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多