在 groupby 之后将组与一个数据帧合并

2024-03-25

我试图回答这个问题 https://stackoverflow.com/questions/47117982/insert-missing-category-for-each-group-in-pandas-dataframe通过组级合并。下面是同一问题的稍作修改的版本,但我需要组级合并的输出。

以下是输入数据帧:

df = pd.DataFrame({ "group":[1,1,1 ,2,2],
                   "cat": ['a', 'b', 'c', 'a', 'c'] ,
                   "value": range(5),
                   "value2": np.array(range(5))* 2})

df

cat group   value value2
a   1         0   0
b   1         1    2
c   1         2    4
a   2         3    6
c   2         4    8

categories = ['a', 'b', 'c', 'd']
categories =  pd.DataFrame(['a', 'b', 'c', 'd'], columns=['cat'])
print(categories)

    cat
0   a
1   b
2   c
3   d

这是预期的输出:

cat group   value  value2
a   1         0    0
b   1         1    2
c   1         2    4
d   NA        NA   NA
a   2         3    6
c   2         4    8
b   NA        NA   NA
d   NA        NA   NA

问题:

我可以通过for循环实现我想要的。有没有熊猫的方法可以做到这一点?

(我需要在之间执行外连接categories以及每组的groupby结果df.groupby('group'))

grouped = df.groupby('group')

merged_list = []
for g in grouped:
    merged = pd.merge(categories, g[1], how = 'outer', on='cat')
    merged_list.append(merged)

out = pd.concat(merged_list)

I think groupby + merge这只是过于复杂的方法。

所以使用速度更快reindex http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.reindex.html by MultiIndex:

mux = pd.MultiIndex.from_product([df['group'].unique(), categories], names=('group','cat'))
df = df.set_index(['group','cat']).reindex(mux).swaplevel(0,1).reset_index()
#add missing values to group column
df['group'] = df['group'].mask(df['value'].isnull())
print (df)
  cat  group  value  value2
0   a    1.0    0.0     0.0
1   b    1.0    1.0     2.0
2   c    1.0    2.0     4.0
3   d    NaN    NaN     NaN
4   a    2.0    3.0     6.0
5   b    NaN    NaN     NaN
6   c    2.0    4.0     8.0
7   d    NaN    NaN     NaN

可能的解决方案:

df = df.groupby('group', group_keys=False)
       .apply(lambda x: pd.merge(categories, x, how = 'outer', on='cat'))
  cat  group  value  value2
0   a    1.0    0.0     0.0
1   b    1.0    1.0     2.0
2   c    1.0    2.0     4.0
3   d    NaN    NaN     NaN
0   a    2.0    3.0     6.0
1   b    NaN    NaN     NaN
2   c    2.0    4.0     8.0
3   d    NaN    NaN     NaN

Timings:

np.random.seed(123)
N = 1000000
L = list('abcd') #235,94.1,156ms

df = pd.DataFrame({'cat': np.random.choice(L, N, p=(0.002,0.002,0.005, 0.991)),
                   'group':np.random.randint(10000,size=N),
                   'value':np.random.randint(1000,size=N),
                   'value2':np.random.randint(5000,size=N)})
df = df.sort_values(['group','cat']).drop_duplicates(['group','cat']).reset_index(drop=True)
print (df.head(10))

categories = ['a', 'b', 'c', 'd']

def jez1(df):
    mux = pd.MultiIndex.from_product([df['group'].unique(), categories], names=('group','cat'))
    df = df.set_index(['group','cat']).reindex(mux, fill_value=0).swaplevel(0,1).reset_index()
    df['group'] = df['group'].mask(df['value'].isnull())
    return df

def jez2(df):
    grouped = df.groupby('group')
    categories =  pd.DataFrame(['a', 'b', 'c', 'd'], columns=['cat'])
    return grouped.apply(lambda x: pd.merge(categories, x, how = 'outer', on='cat'))



def coldspeed(df):
    grouped = df.groupby('group')
    categories =  pd.DataFrame(['a', 'b', 'c', 'd'], columns=['cat'])
    return pd.concat([g[1].merge(categories, how='outer', on='cat') for g in grouped])

def akilat90(df):
    grouped = df.groupby('group')
    categories =  pd.DataFrame(['a', 'b', 'c', 'd'], columns=['cat'])
    merged_list = []

    for g in grouped:
        merged = pd.merge(categories, g[1], how = 'outer', on='cat')
        merged['group'].fillna(merged['group'].mode()[0],inplace=True) # replace the `group` column's `NA`s by mode
        merged.fillna(0, inplace=True)
        merged_list.append(merged)

    return pd.concat(merged_list)

In [471]: %timeit jez1(df)
100 loops, best of 3: 12 ms per loop

In [472]: %timeit jez2(df)
1 loop, best of 3: 14.5 s per loop

In [473]: %timeit coldspeed(df)
1 loop, best of 3: 19.4 s per loop

In [474]: %timeit akilat90(df)
1 loop, best of 3: 22.3 s per loop
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 groupby 之后将组与一个数据帧合并 的相关文章

随机推荐

  • 从 OSX lion 上的版本浏览器恢复不起作用...有什么想法吗?

    我正在尝试从 Lion 上的先前版本恢复基于文档的应用程序 当我选择 恢复版本 时 文本视图不反映更改 但是 如果我关闭应用程序并重新打开 更改就会出现 我正在使用 NSDocument 的文件包装器变体 那么如何使文本视图的文本存储反映立
  • Liquibase:如何禁用 FILENAME 列检查?

    对于我们的应用程序 我们使用 liquibase 我们需要从命令行 在生产中手动 运行数据库迁移 并在应用程序启动时自动运行数据库迁移 测试环境等 问题是 Liquibase 将整个文件名视为变更集身份的一部分 因此如果路径不同 它会尝试重
  • Java重载和继承规则

    我一直在学习 因为我有考试 而且我对 Java 的大部分内容都没有太多问题 但我偶然发现了一条我无法解释的规则 这是一个代码片段 public class A public int method Object o return 1 publ
  • 两个 Div 彼此相邻,然后堆叠响应式更改

    我正在努力实现一些我确信应该比我现在做的更容易的事情 我正在使用 Skeleton 响应式框架 到目前为止一切都很好 这是我想要实现的目标的图表 这将被放置在一列中 一旦该列的大小减小 我希望它按照图中的第二个示例堆叠 div 我尝试了几种
  • 从 tfs 构建中排除测试

    我想从持续集成构建中排除一些测试 但我还没有找到这样做的方法 我尝试过的事情之一是将这些测试的优先级设置为 2 然后在构建中我指定最低测试优先级 1 但它仍然运行这些测试 任何帮助将不胜感激 您应该使用 测试类别 方法 而不是使用已描述的
  • 如何永久清除在启用软删除的情况下创建的整个 azure keyvault?

    当您创建启用了软删除的 azure keyvault 时 即使您将其删除并从头开始重新创建 该 keyvault 仍会保留 启用软删除后 标记为已删除资源的资源将保留指定时间段 默认为 90 天 该服务还提供了一种恢复已删除对象的机制 本质
  • 如何将水平滚动视图移动到特定位置?

    我使用的scrollView没有任何listView或gridview 我刚刚向其中添加了相同的视图 但知道我想以编程方式滚动到特定位置 这可能吗 请帮助我使用水平滚动 你可以使用这个方法 horizontalScrollView scro
  • Angular Jasmine FormControl 单元测试 valueChanges

    我想对以下方法进行单元测试 this boxValue subscribeToFilterChanges void this filterBox valueChanges subscribe data gt if data this box
  • 加入 PIG 对阵 COGROUP

    当我在 pig 中使用 COGROUP 而不是 JOIN 时 有什么优势 性能 没有地图减少 吗 http developer yahoo com hadoop tutorial module6 html http developer ya
  • Kotlin 网站上的“返回 Unit 的方法的构建器风格用法”让我感到困惑

    The IdiomsKotlin 官方文档的部分包含这个例子 http kotlinlang org docs reference idioms html builder style usage of methods that return
  • Kotlin 中带有新参数的 Paging 3.0 列表

    我有以下代码 val history Flow
  • 轻微破坏的意义

    在 C 17 中 新的std optional要求它可以轻易被破坏 如果T在 Optional object dtor 中是可以轻易破坏的 optional 1 Effects If is trivially destructible v
  • sizeof(x) 和 sizeof(p_x) 之间有什么区别

    你能告诉我两者有什么区别吗sizeof x and sizeof p x 在下面的代码中 int x 10 p x p x int malloc 10 sizeof int sizeof x 给出数组使用的字节数x sizeof p x 给
  • 程序退出时如何删除文件? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有没有办法注册一个文件 以便在Python退出时将其删除 无论它如何退出 我正在使用长期存在的临时文件 并希望确保它们被清理 该文件必
  • 启动屏幕故事板迁移问题

    我有一个用 Objective C 构建的应用程序 它使用启动屏幕图像集作为启动画面 根据最近苹果公司的新指南 适用于 iPhone 或 iPad 的应用程序必须使用 iOS 13 SDK 或更高版本构建 并且 使用 Xcode 故事板提供
  • 如何检查同一个java程序的两个实例是否正在运行?

    您好 我正在制作一个将通过 javaw exe 运行的程序 因此它不直接可见 现在我的问题是有时 意外地 用户可能会运行同一应用程序的多个实例 例如输入javaw myProgram两次 在这种情况下 如果程序已经在运行 有什么方法可以阻止
  • Bootstrap Popover 一键点击即可工作 - JavaScript

    我有一些引导按钮 单击按钮时应该显示一个弹出窗口 usernameL onclick function e e currentTarget id popover html true 当网站加载并且我第一次单击按钮时 没有任何反应 如果我第二
  • AlamoFire 在后台会话中下载

    我在新应用程序中使用 Alamofire 基于 Alamofire 的下载管理器示例 我需要一些有关使用后台会话下载文件的说明 我需要重写 SessionDelegate 才能使其正常工作吗 要不就backgroundCompletionH
  • NoClassDefFoundError:android.support.v7.widget.helper.ItemTouchHelper$3

    嗨 我想创建滑动删除RecyclerView结果是崩溃 看着那 这build gradle 我导入了所需的所有库 在代码中我可以使用ItemTouchHelper类但是当我想刷一个项目时它崩溃了 build gradle compile c
  • 在 groupby 之后将组与一个数据帧合并

    我试图回答这个问题 https stackoverflow com questions 47117982 insert missing category for each group in pandas dataframe通过组级合并 下面