• <legend id='v0SiN'><style id='v0SiN'><dir id='v0SiN'><q id='v0SiN'></q></dir></style></legend>

          <bdo id='v0SiN'></bdo><ul id='v0SiN'></ul>
        <tfoot id='v0SiN'></tfoot>
      1. <small id='v0SiN'></small><noframes id='v0SiN'>

      2. <i id='v0SiN'><tr id='v0SiN'><dt id='v0SiN'><q id='v0SiN'><span id='v0SiN'><b id='v0SiN'><form id='v0SiN'><ins id='v0SiN'></ins><ul id='v0SiN'></ul><sub id='v0SiN'></sub></form><legend id='v0SiN'></legend><bdo id='v0SiN'><pre id='v0SiN'><center id='v0SiN'></center></pre></bdo></b><th id='v0SiN'></th></span></q></dt></tr></i><div id='v0SiN'><tfoot id='v0SiN'></tfoot><dl id='v0SiN'><fieldset id='v0SiN'></fieldset></dl></div>

        Pandas Dataframe Groupby Agg-Lambda-Single Value转到先前存在的或新的列表

        Pandas Dataframe GroupBy Agg - LAMBDA - single values go to preexisting or new lists and preexisting lists fusion(Pandas Dataframe Groupby Agg-Lambda-Single Value转到先前存在的或新的列表与先前存在的列表融合) - IT屋-程序员软件开发技术分享社

              <tbody id='GzHnv'></tbody>

          • <small id='GzHnv'></small><noframes id='GzHnv'>

                • <bdo id='GzHnv'></bdo><ul id='GzHnv'></ul>
                  <i id='GzHnv'><tr id='GzHnv'><dt id='GzHnv'><q id='GzHnv'><span id='GzHnv'><b id='GzHnv'><form id='GzHnv'><ins id='GzHnv'></ins><ul id='GzHnv'></ul><sub id='GzHnv'></sub></form><legend id='GzHnv'></legend><bdo id='GzHnv'><pre id='GzHnv'><center id='GzHnv'></center></pre></bdo></b><th id='GzHnv'></th></span></q></dt></tr></i><div id='GzHnv'><tfoot id='GzHnv'></tfoot><dl id='GzHnv'><fieldset id='GzHnv'></fieldset></dl></div>
                  <tfoot id='GzHnv'></tfoot>

                  <legend id='GzHnv'><style id='GzHnv'><dir id='GzHnv'><q id='GzHnv'></q></dir></style></legend>
                • 本文介绍了Pandas Dataframe Groupby Agg-Lambda-Single Value转到先前存在的或新的列表与先前存在的列表融合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我有此DataFrame to groupby密钥:

                  df = pd.DataFrame({
                                     'key': ['1', '1', '1', '2', '2', '3', '3', '4', '4', '5'],
                                     'data1': [['A', 'B', 'C'], 'D', 'P', 'E', ['F', 'G', 'H'], ['I', 'J'], ['K', 'L'], 'M', 'N', 'O']
                                     'data2': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
                                   })
                  df
                  

                  我想将GROUPBY KEY和SUM数据设为2,这部分可以。 但是关于数据1,我想:

                  1. 如果列表尚不存在:
                    • 密钥不重复时,单个值不会更改
                    • 分配给键的单个值合并到一个新列表中
                  2. 如果列表已存在:
                    • 其他单个值被追加到它后面
                    • 附加其他列表值

                  生成的DataFrame应为:

                  dfgood = pd.DataFrame({
                                     'key': ['1', '2', '3', '4', '5'],
                                     'data1': [['A', 'B', 'C', 'D', 'P'], ['F', 'G', 'H', 'E'], ['I', 'J', 'K', 'L'], ['M', 'N'], 'O']
                                     'data2': [6, 9, 13, 17, 10]
                                   })
                  dfgood
                  

                  事实上,我并不真正关心data1值进入列表的顺序,它也可以是将它们保持在一起的任何结构,甚至可以是带分隔符的字符串或集合,如果这样做更容易让它按照您认为最好的方式进行的话。

                  我想了两个解决方案:

                  1. 往那边走:
                  dfgood = df.groupby('key', as_index=False).agg({
                              'data1' : lambda x: x.iloc[0].append(x.iloc[1]) if type(x.iloc[0])==list else list(x),
                              'data2' : sum,
                              })
                  dfgood
                  

                  由于x.iloc[1]中的index out of range无法工作。 我也试过了,因为在this link上的问题中的另一个groupby中,data1是这样组织的:

                  dfgood = df.groupby('key', as_index=False).agg({
                              'data1' : lambda g: g.iloc[0] if len(g) == 1 else list(g)),
                              'data2' : sum,
                              })
                  dfgood
                  

                  但它是从先前存在的列表或值创建新列表,而不是将数据追加到现有列表。

                  1. 另一种方式,但是我觉得比较复杂,应该有更好或者更快的解决方案:
                    • 使用apply
                    • 将data1列表和单个值转换为单个系列
                    • 使用wide_to_long为每个键保留单个值,
                    • 然后分组申请:
                  dfgood = df.groupby('key', as_index=False).agg({
                              'data1' : lambda g: g.iloc[0] if len(g) == 1 else list(g)),
                              'data2' : sum,
                              })
                  dfgood
                  

                  我认为我的问题是我不知道如何正确使用lambdas,并且我尝试了像上一个示例中的x.iloc[1]这样愚蠢的事情。我已经看了很多关于lambdas的教程,但在我的脑海中仍然是模糊不清的。

                  推荐答案

                  存在带标量的问题组合列表,可能的解决方案是先从标量创建列表,然后在groupby.agg中将其展平:

                  dfgood = (df.assign(data1 = df['data1'].apply(lambda y: y if isinstance(y, list) else [y]))
                              .groupby('key', as_index=False).agg({
                              'data1' : lambda x: [z for y in x for z in y],
                              'data2' : sum,
                              })
                              )
                  print (dfgood)
                    key            data1  data2
                  0   1  [A, B, C, D, P]      6
                  1   2     [E, F, G, H]      9
                  2   3     [I, J, K, L]     13
                  3   4           [M, N]     17
                  4   5              [O]     10
                  

                  另一个想法是使用flatten函数只拼合列表,而不是字符串:

                  #https://stackoverflow.com/a/5286571/2901002
                  def flatten(foo):
                      for x in foo:
                          if hasattr(x, '__iter__') and not isinstance(x, str):
                              for y in flatten(x):
                                  yield y
                          else:
                              yield x
                  
                  dfgood = (df.groupby('key', as_index=False).agg({
                              'data1' : lambda x: list(flatten(x)),
                              'data2' : sum}))
                  

                  这篇关于Pandas Dataframe Groupby Agg-Lambda-Single Value转到先前存在的或新的列表与先前存在的列表融合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  groupby multiple coords along a single dimension in xarray(在xarray中按单个维度的多个坐标分组)
                  Group by and Sum in Pandas without losing columns(Pandas中的GROUP BY AND SUM不丢失列)
                  Is there a way of group by month in Pandas starting at specific day number?( pandas 有从特定日期开始的按月分组的方式吗?)
                  Group by + New Column + Grab value former row based on conditionals(GROUP BY+新列+基于条件的前一行抓取值)
                  Groupby and interpolate in Pandas(PANDA中的Groupby算法和插值算法)
                  Pandas - Group Rows based on a column and replace NaN with non-null values(PANAS-基于列对行进行分组,并将NaN替换为非空值)

                  <small id='jJ9c5'></small><noframes id='jJ9c5'>

                  • <bdo id='jJ9c5'></bdo><ul id='jJ9c5'></ul>
                    • <tfoot id='jJ9c5'></tfoot>
                    • <i id='jJ9c5'><tr id='jJ9c5'><dt id='jJ9c5'><q id='jJ9c5'><span id='jJ9c5'><b id='jJ9c5'><form id='jJ9c5'><ins id='jJ9c5'></ins><ul id='jJ9c5'></ul><sub id='jJ9c5'></sub></form><legend id='jJ9c5'></legend><bdo id='jJ9c5'><pre id='jJ9c5'><center id='jJ9c5'></center></pre></bdo></b><th id='jJ9c5'></th></span></q></dt></tr></i><div id='jJ9c5'><tfoot id='jJ9c5'></tfoot><dl id='jJ9c5'><fieldset id='jJ9c5'></fieldset></dl></div>

                              <tbody id='jJ9c5'></tbody>

                            <legend id='jJ9c5'><style id='jJ9c5'><dir id='jJ9c5'><q id='jJ9c5'></q></dir></style></legend>