Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:创建单一尺寸&;按多列分组后对列求和_Python_Pandas - Fatal编程技术网

Python 熊猫:创建单一尺寸&;按多列分组后对列求和

Python 熊猫:创建单一尺寸&;按多列分组后对列求和,python,pandas,Python,Pandas,我有一个数据框架,在其中我对3列进行分组,并聚合数字列的总和和大小。在运行代码之后 df = pd.DataFrame.groupby(['year','cntry', 'state']).agg(['size','sum']) 我得到的信息如下: 现在,我想将我的大小子列与主列分开,只创建一个大小的列,但希望将总和列保留在主列标题下。我尝试过不同的方法,但没有成功。 以下是我尝试过但无法让事情对我起作用的方法: 如果有人能帮我做这件事,我将不胜感激 关于设置 d1 = pd.DataF

我有一个数据框架,在其中我对3列进行分组,并聚合数字列的总和和大小。在运行代码之后

df = pd.DataFrame.groupby(['year','cntry', 'state']).agg(['size','sum'])
我得到的信息如下:

现在,我想将我的大小子列与主列分开,只创建一个大小的列,但希望将总和列保留在主列标题下。我尝试过不同的方法,但没有成功。 以下是我尝试过但无法让事情对我起作用的方法:

如果有人能帮我做这件事,我将不胜感激

关于

设置

d1 = pd.DataFrame(dict(
        year=np.random.choice((2014, 2015, 2016), 100),
        cntry=['United States' for _ in range(100)],
        State=np.random.choice(states, 100),
        Col1=np.random.randint(0, 20, 100),
        Col2=np.random.randint(0, 20, 100),
        Col3=np.random.randint(0, 20, 100),
    ))

df = d1.groupby(['year', 'cntry', 'State']).agg(['size', 'sum'])
df
pd.concat([df[('Col1', 'size')].rename(('', 'size')),
           df.xs('sum', axis=1, level=1, drop_level=False)], axis=1)


回答
最简单的方法是只在
groupby

d1.groupby(['year', 'cntry', 'State']).size()

year  cntry          State        
2014  United States  California       10
                     Florida           9
                     Massachusetts     8
                     Minnesota         5
2015  United States  California        9
                     Florida           7
                     Massachusetts     4
                     Minnesota        11
2016  United States  California        8
                     Florida           8
                     Massachusetts    11
                     Minnesota        10
dtype: int64

要使用计算的
df

df.xs('size', axis=1, level=1)

如果每个列的
大小不同,这将非常有用。但是,由于
大小
列对于
['Col1','Col2','Col3']
是相同的,所以我们可以这样做

df[('Col1', 'size')]

year  cntry          State        
2014  United States  California       10
                     Florida           9
                     Massachusetts     8
                     Minnesota         5
2015  United States  California        9
                     Florida           7
                     Massachusetts     4
                     Minnesota        11
2016  United States  California        8
                     Florida           8
                     Massachusetts    11
                     Minnesota        10
Name: (Col1, size), dtype: int64

组合视图1


组合视图2

d1 = pd.DataFrame(dict(
        year=np.random.choice((2014, 2015, 2016), 100),
        cntry=['United States' for _ in range(100)],
        State=np.random.choice(states, 100),
        Col1=np.random.randint(0, 20, 100),
        Col2=np.random.randint(0, 20, 100),
        Col3=np.random.randint(0, 20, 100),
    ))

df = d1.groupby(['year', 'cntry', 'State']).agg(['size', 'sum'])
df
pd.concat([df[('Col1', 'size')].rename(('', 'size')),
           df.xs('sum', axis=1, level=1, drop_level=False)], axis=1)

piRSquared比我快,但如果您必须这样做,并且希望保持与列和下方的总和或大小对齐,则可以重新索引列以删除大小值,然后添加一个新列以包含大小值

例如:

group = df.groupby(['year', 'cntry','state']).agg(['sum','size'])
mi = pd.MultiIndex.from_product([['Col1','Col2','Col3'],['sum']])
group = group.reindex_axis(mi,axis=1)
sizes = df.groupby('state').size().values
group['Tot'] = 0
group.columns = group.columns.set_levels(['sum','size'], level=1)
group.Tot.size = sizes
结果会是这样的:

                 Col1 Col2 Col3  Tot
                  sum  sum  sum size
year cntry State
2015 US    CA      20    0    4    1
           FL      40    3    5    1
           MASS     8    1    3    1
           MN      12    2    3    1

嗨,piRSquared,谢谢你的详细回复,但是我对上面的代码有两个问题。第一:当我运行代码df.xs('size',axis=1,level=1)时,我得到了以下错误:ValueError:没有为对象类型命名为1的轴;第二,我需要将sum列也保留在col1、col2和col3下。你能告诉我怎么解决这个问题吗?Regards@Baig您得到的第一个值错误来自
df
不是数据帧,而是一个序列。请检查您的变量。如果上面定义了
d1
,并且
df=d1.groupby(['year','cntry','State']).agg(['size','sum'])
,则不可能出现此错误。第二个问题,我将通过更新帖子来解决。