【问题标题】:Replace all value in a pandas subset by values from a list用列表中的值替换熊猫子集中的所有值
【发布时间】:2021-06-19 17:25:42
【问题描述】:

我有一个由 3 个不同的组 A、B、C 组成的数据集:

df = pd.DataFrame([[1, "A", "A"], [2, "B", "B"], [3, "A", "A"], [4, "B", "B"], [5, "C", "C"], [6, "C", "C"],
               [7, "A", "A"], [8, "B", "B"], [9, "C", "C"]],
              columns=["Index", "Group", "Cluster"])

对于每个组,我确定了一些集群,我想用集群的值替换集群列。 每个集群都有一个列表

listA = [0, 1, 1]
listB = [1, 0, 1]
listC = [0, 0, 1]

我想在最后有类似的东西:

Index Group Cluster
1 A 0
2 B 1
3 A 1
4 B 0
5 C 0
6 C 0
7 A 1
8 B 1
9 C 1

【问题讨论】:

    标签: python pandas list replace subset


    【解决方案1】:

    你可以groupby.cumcount,然后merge

    d = {"A":listA,"B":listB,"C":listC}
    u = pd.Series(d).explode().to_frame("Cluster")
    
    v = df.assign(k=df.groupby('Group').cumcount()).merge(
               u.assign(k=u.groupby(level=0).cumcount()).reset_index() ,
    left_on=['Group','k'],right_on=['index','k'],suffixes=('','_y'))
    
    v['Cluster'] = v['Cluster_y']
    out = v.reindex(columns=df.columns)
    

    print(out)
    
       Index Group Cluster
    0      1     A       0
    1      2     B       1
    2      3     A       1
    3      4     B       0
    4      5     C       0
    5      6     C       0
    6      7     A       1
    7      8     B       1
    8      9     C       1
    

    【讨论】:

      【解决方案2】:

      用for循环试试

      for x, y in zip(list('ABC'), [listA,listB,listC]):
           df.loc[df.Group == x, 'Cluster'] = y
      df
      Out[395]: 
         Index Group Cluster
      0      1     A       0
      1      2     B       1
      2      3     A       1
      3      4     B       0
      4      5     C       0
      5      6     C       0
      6      7     A       1
      7      8     B       1
      8      9     C       1
      

      【讨论】:

        【解决方案3】:

        这可能有点幼稚,但假设组的大小与集群标签的大小匹配,您可以排序、分配和求助:

        df.sort_values(['Group', 'Index'], inplace=True)
        df['Cluster'] = listA + listB + listC
        df.sort_values('Index', inplace=True)
        

        结果df:

           Index Group  Cluster
        0      1     A        0
        1      2     B        1
        2      3     A        1
        3      4     B        0
        4      5     C        0
        5      6     C        0
        6      7     A        1
        7      8     B        1
        8      9     C        1
        

        【讨论】:

          【解决方案4】:

          您也可以使用groupbytransform,使用dict 将标签映射到集群(正如another answer 中的anky 所做的那样):

          d = {"A":listA, "B":listB, "C":listC}
          df['Cluster'] = df.groupby('Group')['Cluster'].transform(lambda x : d[x.name])
          

          结果:

             Index Group  Cluster
          0      1     A        0
          1      2     B        1
          2      3     A        1
          3      4     B        0
          4      5     C        0
          5      6     C        0
          6      7     A        1
          7      8     B        1
          8      9     C        1
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-03-16
            • 2022-12-23
            • 2016-05-28
            • 2023-02-25
            • 1970-01-01
            • 1970-01-01
            • 2021-08-31
            • 2020-03-07
            相关资源
            最近更新 更多