标签: pandas-groupby

Python Pandas groupby之后的条件计数

我有以下数据帧:

   key1  key2
0    a   one
1    a   two
2    b   one
3    b   two
4    a   one
5    c   two
Run Code Online (Sandbox Code Playgroud)

现在,我想通过key1对数据帧进行分组,并使用值1计算列key2以获得此结果:

   key1  
0    a   2
1    b   1
2    c   0
Run Code Online (Sandbox Code Playgroud)

我得到通常的计数:

df.groupby(['key1']).size()
Run Code Online (Sandbox Code Playgroud)

但我不知道如何插入条件.

我尝试过这样的事情:

df.groupby(['key1']).apply(df[df['key2'] == 'one'])
Run Code Online (Sandbox Code Playgroud)

但我没有进一步

如果我在这里得到一些帮助,那将是很棒的

问候

python dataframe pandas pandas-groupby

19
推荐指数
3
解决办法
2万
查看次数

Pandas GroupBy 并选择特定列中具有最小值的行

我按 A 列对我的数据集进行分组,然后想取 B 列中的最小值和 C 列中的相应值。

data = pd.DataFrame({'A': [1, 2], 'B':[ 2, 4], 'C':[10, 4]})
data  
    A   B   C
0   1   4   3
1   1   5   4
2   1   2   10
3   2   7   2
4   2   4   4
5   2   6   6  
Run Code Online (Sandbox Code Playgroud)

我想得到:

    A   B   C
0   1   2   10
1   2   4   4
Run Code Online (Sandbox Code Playgroud)

目前我按 A 分组,并创建一个值来指示我将保留在我的数据集中的行:

a = data.groupby('A').min()
a['A'] = a.index
to_keep = [str(x[0]) + str(x[1]) for x in a[['A', 'B']].values]
data['id'] = data['A'].astype(str) + …
Run Code Online (Sandbox Code Playgroud)

python group-by pandas pandas-groupby

19
推荐指数
4
解决办法
1万
查看次数

使用带参数的 Grouped Map Pandas UDF

我想使用 data.groupby.apply() 将函数应用于每个组的 Pyspark Dataframe 的每一行。

我使用了 Grouped Map Pandas UDF。但是我不知道如何向我的函数添加另一个参数。

我尝试使用参数作为一个全局变量,但功能不recongnize它(我的观点是pyspark数据框),
我也试过在这一问题提出的解决方案(大熊猫据帧)使用熊猫GROUPBY()+应用()的参数

      @pandas_udf(schema,PandasUDFType.GROUPED_MAP)
        def function(key,data, interval):
            interval_df=interval.filter(interval["var"]==key).toPandas()
            for value in interval_df:
                  #Apply some operations

        return Data.groupBy("msn").apply(calc_diff, ('arg1'))

Run Code Online (Sandbox Code Playgroud)

或者

 @pandas_udf(schema,PandasUDFType.GROUPED_MAP)
        def function(key,data, interval):
            interval_df=interval.filter(interval["var"]==key).toPandas()
            for value in interval_df:
                  #Apply some operations

        return Data.groupBy("msn").apply(lambda x: calc_diff(x,'arg1'))
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

ValueError: Invalid function: pandas_udfs with function type GROUPED_MAP 必须采用一个参数 (data) 或两个参数 (key, data)。

任何人都可以帮助我解决上述问题。

谢谢

python pyspark pandas-groupby

19
推荐指数
3
解决办法
7161
查看次数

Python Pandas - 如何在多索引上进行分组

以下是我的数据框.我做了一些转换来创建类别列并删除它派生自的原始列.现在我需要进行分组删除重复,例如Love,Fashion可以通过groupby总和汇总.

df.colunms = array([category, clicks, revenue, date, impressions, size], dtype=object)
df.values=
[[Love 0 0.36823 2013-11-04 380 300x250]
 [Love 183 474.81522 2013-11-04 374242 300x250]
 [Fashion 0 0.19434 2013-11-04 197 300x250]
 [Fashion 9 18.26422 2013-11-04 13363 300x250]]
Run Code Online (Sandbox Code Playgroud)

这是我创建数据帧时创建的索引

print df.index
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
       34, …
Run Code Online (Sandbox Code Playgroud)

python multi-index dataframe pandas pandas-groupby

18
推荐指数
2
解决办法
3万
查看次数

Pandas groupby与冗余nan的类别

我在使用pandas groupby和分类数据时遇到了问题.从理论上讲,它应该是超级高效的:您通过整数而不是字符串进行分组和索引.但它坚持认为,在按多个类别进行分组时,必须考虑每个类别组合.

即使普通字符串密度较低,我有时也会使用类别,因为这些字符串很长并且可以节省内存/提高性能.有时每列中有数千个类别.按3列分组时,pandas强制我们保留1000 ^ 3组的结果.

我的问题:有没有一种方便的方法来使用groupby类别,同时避免这种不愉快的行为?我不是在寻找任何这些解决方案:

  • 通过重新创建所有功能numpy.
  • 之前不断转换为字符串/代码groupby,稍后再恢复为类别.
  • 从组列创建元组列,然后按元组列分组.

我希望有一种方法可以修改这个特殊的pandas特质.一个简单的例子如下.而不是输出中我想要的4个类别,我最终得到12个.

import pandas as pd

group_cols = ['Group1', 'Group2', 'Group3']

df = pd.DataFrame([['A', 'B', 'C', 54.34],
                   ['A', 'B', 'D', 61.34],
                   ['B', 'A', 'C', 514.5],
                   ['B', 'A', 'A', 765.4],
                   ['A', 'B', 'D', 765.4]],
                  columns=(group_cols+['Value']))

for col in group_cols:
    df[col] = df[col].astype('category')

df.groupby(group_cols, as_index=False).sum()

Group1  Group2  Group3  Value
#   A   A   A   NaN
#   A   A   C   NaN
# …
Run Code Online (Sandbox Code Playgroud)

python group-by numpy pandas pandas-groupby

18
推荐指数
3
解决办法
5601
查看次数

Groupby类并计算要素中的缺失值

我有一个问题,我在网络或文档中找不到任何解决方案,即使我认为这是非常微不足道的.

我想做什么?

我有这样的数据帧

CLASS FEATURE1 FEATURE2 FEATURE3
  X      A       NaN      NaN
  X     NaN       A       NaN
  B      A        A        A
Run Code Online (Sandbox Code Playgroud)

我想按标签分组(CLASS)并显示每个功能中计算的NaN值的数量,使其看起来像这样.这样做的目的是大致了解缺失值如何分布在不同的类上.

CLASS FEATURE1 FEATURE2 FEATURE3
  X      1        1        2
  B      0        0        0
Run Code Online (Sandbox Code Playgroud)

我知道如何收到空的数量- 价值 -df.groupby['CLASS'].count()

NaN -Values 有类似的东西吗?

我试图从size()中减去count(),但它返回了一个填充了NaN值的无格式输出

python group-by dataframe pandas pandas-groupby

18
推荐指数
3
解决办法
2874
查看次数

大熊猫的.groupby对面是否有"取消组合"操作?

假设我们从这个简单的表开始,存储在pandas数据帧中:

    name  age  family
0   john    1       1
1  jason   36       1
2   jane   32       1
3   jack   26       2
4  james   30       2
Run Code Online (Sandbox Code Playgroud)

然后我做

group_df = df.groupby('family')
group_df = group_df.aggregate({'name': name_join, 'age': pd.np.mean})
Run Code Online (Sandbox Code Playgroud)

其中groupby()是名称的简单聚合函数:

def name_join(list_names, concat='-'):
    return concat.join(list_names)
Run Code Online (Sandbox Code Playgroud)

输出是:

        age             name
family                      
1        23  john-jason-jane
2        28       jack-james
Run Code Online (Sandbox Code Playgroud)

现在的问题.

是否有快速,有效的方法从聚合表中获取以下内容?

    name  age  family
0   john   23       1
1  jason   23       1
2   jane   23       1
3   jack   28       2
4  james   28       2
Run Code Online (Sandbox Code Playgroud)

(注意:数字只是示例,我不关心在此具体示例中取平均值后丢失的信息)

我认为我能做到的方式看起来效率不高:

  1. 创建空数据帧 …

python group-by pandas pandas-groupby

17
推荐指数
3
解决办法
3万
查看次数

Pandas - dataframe groupby - 如何获得多列的总和

这应该是一个简单的,但不知何故,我找不到一个有效的解决方案.

我有一个pandas数据框,如下所示:

index col1   col2   col3   col4   col5
0     a      c      1      2      f 
1     a      c      1      2      f
2     a      d      1      2      f
3     b      d      1      2      g
4     b      e      1      2      g
5     b      e      1      2      g
Run Code Online (Sandbox Code Playgroud)

我想按col1和col2分组,得到sum()col3和col4. Col5可以删除,因为无法聚合数据.

以下是输出的外观.我有兴趣在结果数据帧中同时使用col3col4.这并不重要,如果col1col2是索引与否的一部分.

index col1   col2   col3   col4   
0     a      c      2      4          
1     a      d      1      2      
2     b      d      1      2      
3     b …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas pandas-groupby

17
推荐指数
4
解决办法
3万
查看次数

df.groupby(...).agg(set)与df.groupby(...)相比产生不同的结果.agg(lambda x:set(x))

回答这个问题,事实证明,df.groupby(...).agg(set)并且df.groupby(...).agg(lambda x: set(x))正在产生不同的结果.

数据:

df = pd.DataFrame({
       'user_id': [1, 2, 3, 4, 1, 2, 3], 
       'class_type': ['Krav Maga', 'Yoga', 'Ju-jitsu', 'Krav Maga', 
                      'Ju-jitsu','Krav Maga', 'Karate'], 
       'instructor': ['Bob', 'Alice','Bob', 'Alice','Alice', 'Alice','Bob']})
Run Code Online (Sandbox Code Playgroud)

演示:

In [36]: df.groupby('user_id').agg(lambda x: set(x))
Out[36]:
                    class_type    instructor
user_id
1        {Krav Maga, Ju-jitsu}  {Alice, Bob}
2            {Yoga, Krav Maga}       {Alice}
3           {Ju-jitsu, Karate}         {Bob}
4                  {Krav Maga}       {Alice}

In [37]: df.groupby('user_id').agg(set)
Out[37]:
                                class_type                         instructor
user_id
1        {user_id, class_type, instructor}  {user_id, class_type, instructor}
2 …
Run Code Online (Sandbox Code Playgroud)

python pandas pandas-groupby

17
推荐指数
1
解决办法
595
查看次数

熊猫转换列表不一致的行为

我有可以按预期工作的示例代码段:

import pandas as pd

df = pd.DataFrame(data={'label': ['a', 'b', 'b', 'c'], 'wave': [1, 2, 3, 4], 'y': [0,0,0,0]})
df['new'] = df.groupby(['label'])[['wave']].transform(tuple)
Run Code Online (Sandbox Code Playgroud)

结果是:

  label  wave  y     new
0     a     1  0    (1,)
1     b     2  0  (2, 3)
2     b     3  0  (2, 3)
3     c     4  0    (4,)
Run Code Online (Sandbox Code Playgroud)

如果不是,tuple我给出set, frozenset, dict,它会以类似的方式工作,但是如果给出,list我将得到完全出乎意料的结果:

df['new'] = df.groupby(['label'])[['wave']].transform(list)

  label  wave  y  new
0     a     1  0    1
1     b     2  0    2
2     b     3  0    3 …
Run Code Online (Sandbox Code Playgroud)

python transform pandas pandas-groupby

16
推荐指数
2
解决办法
605
查看次数