【问题标题】:How to map a groupby output (list of unique values) back to the original dataframe?如何将 groupby 输出(唯一值列表)映射回原始数据帧?
【发布时间】:2021-02-03 17:08:03
【问题描述】:

我在将 groupby 输出映射回原始数据帧时遇到问题。为了可视化问题,我创建了一个test_df,它的组装类似于我的真实数据框:

test_df = pd.DataFrame({"a": [1,1,2,2,3,3,3], "b": ["a", "a", "b", "c", "b", "b", "b"], "c": ["L", "O", "O", "K", "N", "O", "W"]})

我的目标是获取每个组的“c”列的所有唯一值(而一个组取决于 a 和 b 列中的值)。我试图通过执行来实现这一点:

test_df.groupby(["a", "b"])["c"].unique()

导致this output。 我无法将其映射回我原来的“test_df”。我也试过用:

test_df.groupby(["a", "b"])["c"].transform(lambda x: np.unique(x))

导致此错误:“ValueError:传递值的长度为 1,索引意味着 8”在我的真实数据帧上。如果我在 np.unique(x) 周围添加 len() 它可以工作,但它显然不会返回我需要的东西。 但是,我的desired DataFrame 看起来像这样:

desired_df = pd.DataFrame({"a": [1,1,2,2,3,3,3], "b": ["a", "a", "b", "c", "b", "b", "b"], "c": ["L", "O", "O", "K", "N", "O", "W"], "d": ["L, O", "L, O", "O", "K", "N, O, W", "N, O, W", "N, O, W"]})

【问题讨论】:

    标签: python pandas pandas-groupby unique


    【解决方案1】:

    使用transform是正确的,但是你需要将np.unique的输出包装成一个与x长度相同的数组:

    test_df['unique_val'] = test_df.groupby(["a", "b"])["c"].transform(lambda x: [x.unique()]*len(x))
    

    输出:

       a  b  c unique_val
    0  1  a  L     [L, O]
    1  1  a  O     [L, O]
    2  2  b  O        [O]
    3  2  c  K        [K]
    4  3  b  N  [N, O, W]
    5  3  b  O  [N, O, W]
    6  3  b  W  [N, O, W]
    

    但是,您似乎希望将唯一值连接为单个字符串,在这种情况下:

    test_df['unique_val'] = test_df.groupby(["a", "b"])["c"].transform(lambda x: ', '.join(x.unique()) )
    

    会起作用的。输出:

       a  b  c unique_val
    0  1  a  L       L, O
    1  1  a  O       L, O
    2  2  b  O          O
    3  2  c  K          K
    4  3  b  N    N, O, W
    5  3  b  O    N, O, W
    6  3  b  W    N, O, W
    

    【讨论】:

      猜你喜欢
      • 2017-05-04
      • 1970-01-01
      • 2015-05-15
      • 2020-07-17
      • 2019-01-06
      • 2021-09-21
      • 2018-10-28
      • 2017-11-13
      • 1970-01-01
      相关资源
      最近更新 更多