GVKun编程网logo

Python-pandas与groupby占总数的百分比(groupby pandas)

26

对于Python-pandas与groupby占总数的百分比感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍groupbypandas,并为您提供关于2018.03.28python-panda

对于Python-pandas与groupby占总数的百分比感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍groupby pandas,并为您提供关于2018.03.28 python-pandas groupby 使用、Groupby并在pandas,Python中转置、pandas groupby查找正确和错误的百分比、Pandas:.groupby()size()和百分比的有用信息。

本文目录一览:

Python-pandas与groupby占总数的百分比(groupby pandas)

Python-pandas与groupby占总数的百分比(groupby pandas)

这显然很简单,但是作为一个笨拙的新手,我陷入了困境。

我有一个包含3列的CSV文件,分别是该办公室的州,办公室ID和销售。

我想计算给定状态下每个办公室的销售百分比(每个州的所有百分比的总和为100%)。

df = pd.DataFrame({''state'': [''CA'', ''WA'', ''CO'', ''AZ''] * 3,                   ''office_id'': range(1, 7) * 2,                   ''sales'': [np.random.randint(100000, 999999)                             for _ in range(12)]})df.groupby([''state'', ''office_id'']).agg({''sales'': ''sum''})

返回:

                  salesstate office_id        AZ    2          839507      4          373917      6          347225CA    1          798585      3          890850      5          454423CO    1          819975      3          202969      5          614011WA    2          163942      4          369858      6          959285

我似乎无法弄清楚如何“高达”的state水平groupby与总起来sales对整个state计算分数。

答案1

小编典典

你将不得不创建第二个groupby对象,但是你可以以一种更简单的方式来计算百分比-仅groupby计算state_office并将该sales列除以其和即可。复制Paul H答案的开头:

# From Paul Himport numpy as npimport pandas as pdnp.random.seed(0)df = pd.DataFrame({''state'': [''CA'', ''WA'', ''CO'', ''AZ''] * 3,                   ''office_id'': list(range(1, 7)) * 2,                   ''sales'': [np.random.randint(100000, 999999)                             for _ in range(12)]})state_office = df.groupby([''state'', ''office_id'']).agg({''sales'': ''sum''})# Change: groupby state_office and divide by sumstate_pcts = state_office.groupby(level=0).apply(lambda x:                                                 100 * x / float(x.sum()))

返回值:

                     salesstate office_id           AZ    2          16.981365      4          19.250033      6          63.768601CA    1          19.331879      3          33.858747      5          46.809373CO    1          36.851857      3          19.874290      5          43.273852WA    2          34.707233      4          35.511259      6          29.781508

2018.03.28 python-pandas groupby 使用

2018.03.28 python-pandas groupby 使用

groupby 分组统计

1. 根据某些条件将数据分组

2. 对每个组独立应用函数

3. 将结果合并到一个数据结构中

Dataframe 在行或列上分组,将一个函数应用到各个分组并产生一个新值,然后函数执行结果被合并到最终的结果对象中

#分组
import numpy as np
import pandas as pd
df = pd.DataFrame({''A'':[''foo'',''bar'',''foo'',''bar'',''foo'',''bar'',''foo'',''foo''], ''B'':[''one'',''one'',''two'',''three'',''two'',''two'',''one'',''three''], ''C'':np.random.randn(8), ''D'':np.random.randn(8)}) print(df) print(''------'') print(df.groupby(''A''),type(df.groupby(''A''))) #直接分组得到的是groupby对象,是一个中间数据,没有进行计算 print(df.groupby(''A'').sum())#自动过滤字符串列 print(df.groupby(''A'').mean())#平均值 b = df.groupby([''A'',''B'']).mean() print(b,type(b),''\n'',b.columns) c = df.groupby([''A''])[''D''].mean()#以A分组,取D列平均值 print(c,type(c),''\n'')

结果:
     A      B         C         D
0  foo    one  0.429615 -0.708782
1  bar    one  0.891751  1.140575
2  foo    two -0.261858 -0.516835
3  bar  three  1.310361  0.269657
4  foo    two  1.048076  1.374218
5  bar    two -0.410148  1.061132
6  foo    one -1.124137 -0.729367
7  foo  three  0.289513  0.892714
------
<pandas.core.groupby.DataFrameGroupBy object at 0x000000000FBACA58> <class ''pandas.core.groupby.DataFrameGroupBy''>
            C         D
A                     
bar  1.791963  2.471364
foo  0.381208  0.311947
            C         D
A                     
bar  0.597321  0.823788
foo  0.076242  0.062389
                  C         D
A   B                       
bar one    0.891751  1.140575
    three  1.310361  0.269657
    two   -0.410148  1.061132
foo one   -0.347261 -0.719074
    three  0.289513  0.892714
    two    0.393109  0.428691 <class ''pandas.core.frame.DataFrame''>
Index([''C'', ''D''], dtype=''object'')
A
bar    0.823788
foo    0.062389
Name: D, dtype: float64 <class ''pandas.core.series.Series''>

#分组 - 可迭代的对象
df = pd.DataFrame({''X'':[''A'',''B'',''A'',''B''],''Y'':[1,3,4,2]})
print(df)
print(df.groupby(''X''),type(df.groupby(''X'')))
print(''-------'')
print(list(df.groupby(''X'')),''->可迭代对象,直接生成list\n'')
print(list(df.groupby(''X''))[0],''->以元组的形式显示'')
for n,g in df.groupby(''X''):
    print(n)
    print(g)
    print(''###'')
print(''--------'')
#n是组名,g是分组后的DataFrame
print(df.groupby([''X'']).get_group(''A''),''\n'')
print(df.groupby([''X'']).get_group(''B''),''\n'')
#.get_group提取分组后的组

grouped = df.groupby([''X''])
print(grouped.groups)
print(grouped.groups[''A''])#也可写 df.groupby(''X'').groups[''A'']
print(''-------'')
#.groups:将分组后的groups转化为dict
#可以字典索引方法来查看groups里的元素

sz = grouped.size()
print(sz,type(sz))
#.size() 查看分组后的长度
print(''---------'')
df = pd.DataFrame({''A'':[''foo'',''bar'',''foo'',''bar'',''foo'',''bar'',''foo'',''foo''],
                   ''B'':[''one'',''one'',''two'',''three'',''two'',''two'',''one'',''three''],
                   ''C'':np.random.randn(8),
                   ''D'':np.random.randn(8)})
grouped = df.groupby([''A'',''B'']).groups
print(df)
print(grouped)
print(grouped[''foo'',''three''])

dic=dict({''A'':[1,2,3],
       ''B'':[2,3,4]})
print(dic,type(dic))

结果:
   X  Y
0  A  1
1  B  3
2  A  4
3  B  2
<pandas.core.groupby.DataFrameGroupBy object at 0x000000000F889F60> <class ''pandas.core.groupby.DataFrameGroupBy''>
-------
[(''A'',    X  Y
0  A  1
2  A  4), (''B'',    X  Y
1  B  3
3  B  2)] -> 可迭代对象,直接生成 list

(''A'',    X  Y
0  A  1
2  A  4) -> 以元组的形式显示
A
   X  Y
0  A  1
2  A  4
###
B
   X  Y
1  B  3
3  B  2
###
--------
   X  Y
0  A  1
2  A  4

   X  Y
1  B  3
3  B  2

{''A'': Int64Index([0, 2], dtype=''int64''), ''B'': Int64Index([1, 3], dtype=''int64'')}
Int64Index([0, 2], dtype=''int64'')
-------
X
A    2
B    2
dtype: int64 <class ''pandas.core.series.Series''>
---------
     A      B         C         D
0  foo    one -0.881923 -0.825102
1  bar    one -0.626412 -0.618638
2  foo    two -1.741248  1.557698
3  bar  three  1.076928  1.738265
4  foo    two -0.954103 -0.741415
5  bar    two  1.224841 -0.479472
6  foo    one  0.680046 -0.476137
7  foo  three -1.519952 -0.421738
{(''bar'', ''one''): Int64Index([1], dtype=''int64''), (''bar'', ''three''): Int64Index([3], dtype=''int64''), (''bar'', ''two''): Int64Index([5], dtype=''int64''), (''foo'', ''one''): Int64Index([0, 6], dtype=''int64''), (''foo'', ''three''): Int64Index([7], dtype=''int64''), (''foo'', ''two''): Int64Index([2, 4], dtype=''int64'')}
Int64Index([7], dtype=''int64'')
{''A'': [1, 2, 3], ''B'': [2, 3, 4]} <class ''dict''>

#其他轴上分组
df = pd.DataFrame({''data1'':np.random.randn(2),
                   ''data2'':np.random.randn(2),
                   ''key1'':[''a'',''b''],
                   ''key2'':[''one'',''two'']})
print(df)
print(df.dtypes)
print(''--------'')
for n,p in df.groupby(df.dtypes,axis=1):
    print(n)
    print(p)
    print(''##'')
#按照值类型分组,分为2组

结果:
      data1     data2 key1 key2
0  0.813374  0.232957    a  one
1 -0.213256  1.393156    b  two
data1    float64
data2    float64
key1      object
key2      object
dtype: object
--------
float64
      data1     data2
0  0.813374  0.232957
1 -0.213256  1.393156
##
object
  key1 key2
0    a  one
1    b  two
##

#通过字典或者Series分组
df = pd.DataFrame(np.arange(16).reshape(4,4),
                 columns = [''a'',''b'',''c'',''d''])
print(df)
print(''-------'')

mapping = {''a'':''one'',''b'':''one'',''c'':''two'',''d'':''two'',''e'':''three''}
print(mapping)
by_column = df.groupby(mapping,axis = 1)
print(by_column.sum())
print(''---------'')
#mapping中 a,b列对应为one,c,d列对应为two,以字典为分组

s=pd.Series(mapping)
print(s)
print(s.groupby(s).count())
#s中,index = a,b对应的是one;c,d对应的是two,以Series来分组

结果:
    a   b   c   d
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15
-------
{''a'': ''one'', ''b'': ''one'', ''c'': ''two'', ''d'': ''two'', ''e'': ''three''}
   one  two
0    1    5
1    9   13
2   17   21
3   25   29
---------
a      one
b      one
c      two
d      two
e    three
dtype: object
one      2
three    1
two      2
dtype: int64

 

Groupby并在pandas,Python中转置

Groupby并在pandas,Python中转置

数据框有

ID  col  col2   col3   col4

1   A    50      S      1
1   A    52      M      4
1   B    45      N      8
1   C    18      S      7

想要数据框

ID  col  colA   colB   colC   colD   colE   colF

1   A    50     52      S      M       1      4
1   B    45     NULL    N     NULL     8     NULL
1   C    18     NULL    S     NULL     7     NULL

我想要每个唯一ID + col(groupby ID和col)一行。如果每个ID +
col有多个条目(最大值不能为2,则不能再增加),然后将col2的第一个值放入colA并将第二个值放入colB,将col3的第一个值放入colC和第二个值在colD中,然后将第一个colE中的col4值和colF中的第二个值。如果每个ID+ col只有一个条目,那么对于col2,将值放入colA,而colB为null等。

我尝试首先创建一个计数器:

df['COUNT'] = df.groupby(['ID','col']).cumcount()+1

从这里开始,我想添加一个专栏说

if count=1 then df['colA']=df.col2
if count=2 then df['colB']=df.col2

..但这仍将导致与原始df相同的行数。

pandas groupby查找正确和错误的百分比

pandas groupby查找正确和错误的百分比

我有一列网站:[‘加拿大’,’美国’,’中国’....]

每个站点在SITE列中出现多次,并且每个实例旁边的值为true或false。

INDEX | VALUE | SITE0     | True  | Canada1     | False | Canada2     | True  | USA3     | True  | USA

它继续。

目标1:我想为每个站点查找VALUE列中True的百分比。

目标2:我想返回一个网站列表,其中VALUE列中的%True大于10%。

如何使用groupby实现此目的?我只知道如何使用groupby查找每个站点的均值,这对我没有帮助。

答案1

小编典典

像这样:

In [13]: g = df.groupby(''SITE'')[''VALUE''].mean()In [14]: g[g > 0.1]Out[14]: SITECanada    0.5USA       1.0

Pandas:.groupby()size()和百分比

Pandas:.groupby()size()和百分比

我有一个源自df.groupby().size()操作的DataFrame,看起来像这样:

Localization                           RNA level      
cytoplasm                              1 Non-expressed     7
                                       2 Very low         13
                                       3 Low               8
                                       4 Medium            6
                                       5 Moderate          8
                                       6 High              2
                                       7 Very high         6
cytoplasm & nucleus                    1 Non-expressed     5
                                       2 Very low          8
                                       3 Low               2
                                       4 Medium           10
                                       5 Moderate         16
                                       6 High              6
                                       7 Very high         5
cytoplasm & nucleus & plasma membrane  1 Non-expressed     6
                                       2 Very low          3
                                       3 Low               3
                                       4 Medium            7
                                       5 Moderate          8
                                       6 High              4
                                       7 Very high         1

我要执行的操作是计算单独出现的次数(即最后一列来自.size()),以占适用项中出现的总数的百分比Localization

例如:cytoplasm定位中总共出现了50次(7 + 13 + 8 + 6 + 8 + 2 + 6),分别产生14%和26%的RNANon- expressedVery lowRNA水平。

有没有很好的方法可以做到这一点?我一直在以一种我认为非常round回的方式进行处理,即为每个对象创建一个新的DataFrameLocalization并从那里开始进行工作,但是存在很多局限性,并且最终必须合并所有生成的DataFrames
。我希望至少有一种更聪明的方法!

今天关于Python-pandas与groupby占总数的百分比groupby pandas的讲解已经结束,谢谢您的阅读,如果想了解更多关于2018.03.28 python-pandas groupby 使用、Groupby并在pandas,Python中转置、pandas groupby查找正确和错误的百分比、Pandas:.groupby()size()和百分比的相关知识,请在本站搜索。

本文标签: