对于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)
- 2018.03.28 python-pandas groupby 使用
- Groupby并在pandas,Python中转置
- pandas groupby查找正确和错误的百分比
- Pandas:.groupby()size()和百分比
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 使用
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中转置
数据框有
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查找正确和错误的百分比
我有一列网站:[‘加拿大’,’美国’,’中国’....]
每个站点在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()和百分比
我有一个源自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-
expressed
和Very low
RNA水平。
有没有很好的方法可以做到这一点?我一直在以一种我认为非常round回的方式进行处理,即为每个对象创建一个新的DataFrameLocalization
并从那里开始进行工作,但是存在很多局限性,并且最终必须合并所有生成的DataFrames
。我希望至少有一种更聪明的方法!
今天关于Python-pandas与groupby占总数的百分比和groupby pandas的讲解已经结束,谢谢您的阅读,如果想了解更多关于2018.03.28 python-pandas groupby 使用、Groupby并在pandas,Python中转置、pandas groupby查找正确和错误的百分比、Pandas:.groupby()size()和百分比的相关知识,请在本站搜索。
本文标签: