熊猫如何根据条件在groupby中划分行列
Posted
技术标签:
【中文标题】熊猫如何根据条件在groupby中划分行列【英文标题】:Pandas how to divide columns of rows within groupby based on condition 【发布时间】: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
用于C1
或C1
和C10
中的每个组吗?如果是后者,那么您有六个组?
三组?组 (1,3)、组 (1,5) 和组 (2,8)?
固定类型,只有2组(C1和C10总是相等的)
【参考方案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
【讨论】:
我得到 'ValueErrorIndex contains duplicate entries, cannot reshape' 对于 pivot 命令,有什么方法可以检查重复项的确切位置? (我的 df 实际上是 10K+ 行,应该重复所以不知道如何找到 id)【参考方案2】:我们可以pivot
重塑数据框然后使用eval
计算target / end
,然后merge
给定df
与C1, 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 我得到 'ValueErrorIndex 包含重复的条目,无法为数据透视命令重塑',有什么方法可以检查重复项的确切位置? (我的 df 实际上是 10K+ 行,应该重复所以不知道如何找到 id) @okuoub 检查df[['C1' , 'c10', 'val_type']].duplicated().any()
@okuoub 如果您不关心重复项或想要删除重复项,那么我们可以使用pivot_table
和aggfunc='first'
:df.merge(df.pivot_table('val', c, 'val_type', aggfunc='first').eval('target/end').rename('new'), on=c)
以上是关于熊猫如何根据条件在groupby中划分行列的主要内容,如果未能解决你的问题,请参考以下文章