【问题标题】:Instantiate a class in a groupby method在 groupby 方法中实例化一个类
【发布时间】:2020-09-18 08:57:22
【问题描述】:

我有以下文件类:

class File:
    def __init__(self, file_name, md5):
        self.file_name = file_name
        self.md5 = md5
    def do_something(self):
        ...

是否可以直接从 pandas 中的 groupedby 映射创建此对象。例如这样的:

df_grouped = df.groupby(by=['resolution','media_type', 'asset_type'])
df_grouped_2 = df_grouped.apply(lambda x: File(x['file_name'], x['md5']))
print (df_grouped_2)

我应该能够得到类似的东西:

# resolution  media_type  asset_type
# HD          Video       Feature       [<obj1>, <obj2>, ...]
#                         Promo         [<obj1>]
#                         Trailer       [<obj1>, <obj2>, ...]

我该如何做类似上述的事情(还有我需要在class 上添加的其他方法,例如__hash__ 吗?)

【问题讨论】:

  • 你想达到什么目的?可能有一种更简单的方法可以随心所欲。
  • @anon01 我有一个来自我之前的问题的dict stackoverflow.com/questions/63408061/…,现在我想看看它是否可以扩展到一个可以添加自己的方法等的对象.
  • 您能否进一步阐明您的基本目标?
  • @anon01 实际上只是具有 dict 类型的扩展。能够更轻松地添加自定义方法并对该项目进行类型检查。
  • 我想你可以定义一个函数(不是类),它接受数组并返回对象并使用groupby.apply。对.apply 的一次调用循环遍历组并将过滤后的行传递给您的函数,该函数必须返回单行,例如单个对象或对象列表。要返回所有行而不是一个使用 .transform 而不是 .apply... 这就是我能想到的所有细节

标签: python pandas


【解决方案1】:

我不确定这是否是一个解决方案。您可以在 apply 方法中实例化对象。我创建了一个示例类和数据框。

class Test:
    def __init__(self, a, b):
        self.a = a
        self.b = b

df = pd.DataFrame({
    'group': list('abbaabcc'),
    'group2': list('abababab'),
    'a': [1,2,1,2,3,2,3,4],
    'b': [3,4,2,3,4,5,3,4]
})
df

输出

  group group2  a  b
0     a      a  1  3
1     b      b  2  4
2     b      a  1  2
3     a      b  2  3
4     a      a  3  4
5     b      b  2  5
6     c      a  3  3
7     c      b  4  4

在应用中创建对象

df.groupby(['group','group2'])[['a','b']].apply(
    lambda x: [Test(e[0],e[1]) for _,e in x.iterrows()])

输出

group  group2
a      a         [<__main__.Test object at 0x7f5351df0390>, <__...
       b                [<__main__.Test object at 0x7f5351df03d0>]
b      a                [<__main__.Test object at 0x7f5351df0450>]
       b         [<__main__.Test object at 0x7f5351df0490>, <__...
c      a                [<__main__.Test object at 0x7f5351df0550>]
       b                [<__main__.Test object at 0x7f5351df04d0>]
dtype: object

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多