【问题标题】:Pandas how to divide columns of rows within groupby based on condition熊猫如何根据条件在groupby中划分行列
【发布时间】:2021-09-12 10:42:02
【问题描述】:

我有数据框

C1    c10 val val_type
1      3   5   target
1      3   8   end
1      3   9   other
2      8   1   end
2      8   2   target
2      8   9   other

C1、C10 的值创建 3 个组。 在这些组中,我想创建一个新列,即目标/结束。 所以输出将是:

C1    c10 val val_type   new 
1      3   5   target    0.652
1      3   8   end       0.652
1      3   9   other     0.652
2      8   12  end       0.166
2      8   2   target    0.166
2      8   9   other     0.166

最好的方法是什么?

编辑:忽略其他

【问题讨论】:

  • 其他人会怎样?你会忽略它吗?
  • 您想要target/end 用于C1C1C10 中的每个组吗?如果是后者,那么您有六个组?
  • 三组?组 (1,3)、组 (1,5) 和组 (2,8)?
  • 固定类型,只有2组(C1和C10总是相等的)

标签: python pandas dataframe data-science data-munging


【解决方案1】:

你可以pivot它:

s = df.pivot("C1", "val_type", "val")
df["new"] = df["C1"].map(s["target"]/s["end"])
print (df)

   C1  c10  val val_type       new
0   1    3    5   target  0.625000
1   1    3    8      end  0.625000
2   1    5    9    other  0.625000
3   2    8   12      end  0.166667
4   2    8    2   target  0.166667
5   2    8    9    other  0.166667

【讨论】:

  • 我得到 '{ValueError}Index contains duplicate entries, cannot reshape' 对于 pivot 命令,有什么方法可以检查重复项的确切位置? (我的 df 实际上是 10K+ 行,应该重复所以不知道如何找到 id)
【解决方案2】:

我们可以pivot 重塑数据框然后使用eval 计算target / end,然后merge 给定dfC1, c10 上的评估列

c = ['C1', 'c10']
df.merge(df.pivot(c, 'val_type', 'val').eval('target/end').rename('new'), on=c)

   C1  c10  val val_type       new
0   1    3    5   target  0.625000
1   1    3    8      end  0.625000
2   1    3    9    other  0.625000
3   2    8   12      end  0.166667
4   2    8    2   target  0.166667
5   2    8    9    other  0.166667

【讨论】:

  • @Shubam Sharma 我得到 '{ValueError}Index 包含重复的条目,无法为数据透视命令重塑',有什么方法可以检查重复项的确切位置? (我的 df 实际上是 10K+ 行,应该重复所以不知道如何找到 id)
  • @okuoub 检查df[['C1' , 'c10', 'val_type']].duplicated().any()
  • @okuoub 如果您不关心重复项或想要删除重复项,那么我们可以使用pivot_tableaggfunc='first'df.merge(df.pivot_table('val', c, 'val_type', aggfunc='first').eval('target/end').rename('new'), on=c)
猜你喜欢
  • 2022-01-25
  • 2016-10-31
  • 2021-11-07
  • 1970-01-01
  • 2021-08-27
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
相关资源
最近更新 更多