熊猫-基于groupby中其他列设置列的最佳方法

布莱恩特

我很难想象在熊猫中实现这一目标的另一种方法。我的方式“有效”,但速度非常慢。在高层次上,我想这样做:

  1. 将数据分组为a id,找到的中值a
  2. 找出的每个值a与其组中位数之间的差
  3. 在一组中值中找到最大值
  4. 然后,在该组中,如果a缺少/不可用,a则如果发现的值step 3小于公差(例如1),则将其覆盖/设置为中位数

这是我的方法:

假设数据帧为df:

df = pd.DataFrame({'id': [1,1,2,2,3], 'a': [1, np.nan, 3, 1, 2], 'b': [np.nan, 6, 5, np.nan, 4], 'c': [4, 1, 2, 3, 3]})

    id   a    b  c
0   1  1.0  NaN  4
1   1  NaN  6.0  1
2   2  3.0  5.0  2
3   2  1.0  NaN  3
4   3  2.0  4.0  3

步骤1:

df['median'] = df.groupby(['id'])['a'].transform('median')

第2步:

df['diff'] = abs(df['a'] - df['median'])

步骤3:

df['diff'] = df.groupby(['id'])['diff'].transform('max')

第四步:

for key, g in df.groupby(['id']):
    index = (df.id == key) & (df['diff'] < 1.0) & (df.a.isna())
    if not df[index].empty:
        df.loc[index, 'a'] = g['median']

我相对相信步骤1-3是正确的,并且以有效的方式完成了(希望在偶代大熊猫中完成)。第4步我不喜欢,我很确定这是瓶颈,而且这似乎是错误的方法。我想不通另一种方法。

在改进第4步中有什么建议(如果有错,则建议1-3,或者可以采取更好的方法)?

编辑:正如您可能已经注意到的,如果您已经做到了这一点,这只是我尝试以特定方式填充缺失值。如果有一种更简单的方法来完成整件事,那么我很烦:)

圆珠笔

由于中位数列已经对齐'a',因此我认为您根本不需要循环,甚至不需要循环groupby

df['a'] = df['median'].where(df['a'].isna() & (df['diff'] < 1), df['a'])

这将在适当的地方采用中位数,否则请使用'a'

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

熊猫,基于多行中的其他列创建新列

熊猫在基于其他列的列中删除值

熊猫 - 基于其他列的分组添加列

定义函数以基于其他列(熊猫)创建列

如何基于其他2列汇总熊猫列的计数

如何获得基于熊猫其他列的列的较小值?

熊猫合并其他列中的 NaN

熊猫:基于其他列创建新列的有效方法。多对少

如何基于熊猫中其他列的条件对列的某些值求平均值

熊猫如何基于df中的其他布尔列创建布尔列

如何基于熊猫数据框中的其他列值更新“余额”列

使用基于熊猫中其他列的循环创建多列

熊猫-基于其他列创建总计列

大熊猫基于其他列分配值

基于其他列值的熊猫条件填充

熊猫groupby:计算满足其他列条件的行?

熊猫:如何创建基于其他列值的条件对其他列求和的列?

根据熊猫中其他两个列的比较将列设置为true / false?

熊猫如何使用.loc根据其他列中的值将列设置为NaN

遍历熊猫行并根据其他列中的值设置列值

如何基于熊猫数据框中的其他列进行组合

使用熊猫库基于csv中的其他列值填充空白值

在熊猫中,如何基于其他列的通用相互关系创建唯一的ID?

熊猫-检查其他列是否基于其他列重复

计分熊猫列与其他列

根据其他列中的匹配单词创建熊猫列

根据其他列值在熊猫中添加新列

根据熊猫中的其他列修改列数据

根据其他列的条件在熊猫中创建新列