标签: pandas-groupby

将组总计添加到Pandas中的数据框的最佳方法

我有一个简单的任务,我想知道是否有更好/更有效的方法.我有一个如下所示的数据框:

  Group  Score  Count
0     A      5    100
1     A      1     50
2     A      3      5
3     B      1     40
4     B      2     20
5     B      1     60
Run Code Online (Sandbox Code Playgroud)

我想添加一个包含组总计数值的列:

  Group  Score  Count  TotalCount
0     A      5    100         155
1     A      1     50         155
2     A      3      5         155
3     B      1     40         120
4     B      2     20         120
5     B      1     60         120
Run Code Online (Sandbox Code Playgroud)

我这样做的方式是:

Grouped=df.groupby('Group')['Count'].sum().reset_index()
Grouped=Grouped.rename(columns={'Count':'TotalCount'})

df=pd.merge(df, Grouped, on='Group', how='left')
Run Code Online (Sandbox Code Playgroud)

是否有更好/更清晰的方法将这些值直接添加到数据框?

谢谢您的帮助.

python pandas pandas-groupby

7
推荐指数
1
解决办法
3855
查看次数

pandas:在groupby'date'中删除重复项

我有以下数据帧:

df = pd.read_csv('https://raw.githubusercontent.com/108michael/ms_thesis/master/crsp.dime.mpl.df')

df.groupby('date').cid.size()

date
2005       7
2006     237
2007    3610
2008    1318
2009    2664
2010     997
2011    6390
2012    2904
2013    7875
2014    3979

df.groupby('date').cid.nunique()

date
2005      3
2006     10
2007    227
2008     52
2009    142
2010     57
2011    219
2012     99
2013    238
2014    146
Name: cid, dtype: int64
Run Code Online (Sandbox Code Playgroud)

我想消除重复的cid值,使输出df.groupby('date').cid.size()匹配输出df.groupby('date').cid.nunique().我看过这篇文章,但它似乎没有一个可靠的解决方案.

我尝试过以下方法:

df = pd.read_csv('https://raw.githubusercontent.com/108michael/ms_thesis/master/crsp.dime.mpl.df')

df.groupby('date').cid.size()

date
2005       7
2006     237
2007    3610
2008    1318
2009    2664
2010     997
2011 …
Run Code Online (Sandbox Code Playgroud)

python unique duplicates pandas pandas-groupby

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

pandas中的新列 - 通过应用列表groupby将数组添加到数据框中

给出以下内容 df

  Id other  concat
0  A     z       1
1  A     y       2
2  B     x       3
3  B     w       4
4  B     v       5
5  B     u       6
Run Code Online (Sandbox Code Playgroud)

我希望结果包含new带有分组值的列作为列表

  Id other  concat           new
0  A     z       1        [1, 2]
1  A     y       2        [1, 2]
2  B     x       3  [3, 4, 5, 6]
3  B     w       4  [3, 4, 5, 6]
4  B     v       5  [3, 4, 5, 6]
5  B     u       6  [3, 4, 5, 6] …
Run Code Online (Sandbox Code Playgroud)

python group-concat dataframe pandas pandas-groupby

7
推荐指数
1
解决办法
777
查看次数

pandas groupby抵消了不同的开始

我有一个简单的偏移问题,我似乎无法在之前的其他帖子中找到答案.我想在几周之内进行分组,但是默认情况下df.groupby(pd.TimeGrouper('1W'))我会在周日开始给我.

比方说,我希望这个groupby在星期二开始.我试图天真地添加pd.DateOffset(days=2)作为一个额外的参数,但似乎没有用.

python group-by offset pandas pandas-groupby

7
推荐指数
1
解决办法
304
查看次数

pandas dataframe:如何计算二进制列中的1行数?

我有以下pandas DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({"first_column": [0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0]})

>>> df
    first_column
0              0
1              0
2              0
3              1
4              1
5              1
6              0
7              0
8              1
9              1
10             0
11             0
12             0
13             0
14             1
15             1
16             1
17             1
18             1
19             0
20             0
Run Code Online (Sandbox Code Playgroud)

first_column …

python group-by dataframe pandas pandas-groupby

7
推荐指数
2
解决办法
818
查看次数

pandas groupby,其中您获得一列的最大值和另一列的最小值

我有一个数据帧如下:

user    num1    num2
a       1       1
a       2       2
a       3       3
b       4       4
b       5       5
Run Code Online (Sandbox Code Playgroud)

我想要一个数据帧,每个用户的最小值为num1,每个用户的最大值为num2.

输出应该是:

user    num1    num2
a       1       3
b       4       5
Run Code Online (Sandbox Code Playgroud)

我知道如果我想要两列的最大值,我可以这样做:

a.groupby('user')['num1', 'num2'].max()
Run Code Online (Sandbox Code Playgroud)

是否有一些等价物,而不必做以下事情:

series_1 = a.groupby('user')['num1'].min() 
series_2 = a.groupby('user')['num2'].max()

# converting from series to df so I can do a join on user
df_1 = pd.DataFrame(np.array([series_1]).transpose(), index=series_1.index, columns=['num1']) 
df_2 = pd.DataFrame(np.array([series_2]).transpose(), index=series_2.index, columns=['num2'])

df_1.join(df_2)
Run Code Online (Sandbox Code Playgroud)

python pandas pandas-groupby

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

熊猫,groupby和伯爵

我有一个像这样的数据框

>>> df = pd.DataFrame({'user_id':['a','a','s','s','s'],
                    'session':[4,5,4,5,5],
                    'revenue':[-1,0,1,2,1]})

>>> df
   revenue  session user_id
0       -1        4       a
1        0        5       a
2        1        4       s
3        2        5       s
4        1        5       s
Run Code Online (Sandbox Code Playgroud)

和会话和收入的每个值代表了一种类型的,我要统计每个种类的数量表示的数量revenue=-1session=4user_id=a为1.

我发现简单的调用count()函数,因为groupby()无法输出我想要的结果.

>>> df.groupby('user_id').count()
         revenue  session
user_id
a              2        2
s              3        3
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

python pandas pandas-groupby

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

熊猫:带有日期标准的SQL SelfJoin

我经常在关系数据库中的SQL中进行的一个查询是将表连接回自身,并根据相同id的记录在时间上向后或向前汇总每一行.

例如,假设table1为列'ID','Date','Var1'

在SQL中,我可以为过去3个月的每个记录加上var1,如下所示:

Select a.ID, a.Date, sum(b.Var1) as sum_var1
from table1 a
left outer join table1 b
on a.ID = b.ID
and months_between(a.date,b.date) <0
and months_between(a.date,b.date) > -3
Run Code Online (Sandbox Code Playgroud)

在熊猫队有什么办法吗?

python pandas pandas-groupby

7
推荐指数
1
解决办法
198
查看次数

为什么大熊猫比我的慢?

我有一个数据框

            ID  CAT    SCORE
0            0    0  8325804
1            0    1  1484405
...        ...  ...      ...
1999980  99999    0  4614037
1999981  99999    1  1818470
Run Code Online (Sandbox Code Playgroud)

我在哪里对数据进行分组,ID并希望了解每个ID最高得分的2个类别.我可以看到两个解决方案:

df2 = df.groupby('ID').apply(lambda g: g.nlargest(2, columns='SCORE'))
Run Code Online (Sandbox Code Playgroud)

或者手动将其转换为元组列表,对元组进行排序,删除除2之外的每个ID,然后转换回数据帧.第一个应该比第二个快,但我观察到手动解决方案更快.

为什么手动nlargest比熊猫解决方案更快?

MVCE

import numpy as np
import pandas as pd
import time


def create_df(n=10**5, categories=20):
    np.random.seed(0)
    df = pd.DataFrame({'ID': [id_ for id_ in range(n) for c in range(categories)],
                       'CAT': [c for id_ in range(n) for c in range(categories)],
                       'SCORE': np.random.randint(10**7, size=n * categories)})
    return df


def …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas pandas-groupby

7
推荐指数
1
解决办法
380
查看次数

填写groupby的缺失日期

想象一下,我有一个看起来像这样的数据框:

ID      DATE         VALUE
1    31-01-2006        5
1    28-02-2006        5
1    31-05-2006        10
1    30-06-2006        11
2    31-01-2006        5
2    31-02-2006        5
2    31-03-2006        5
2    31-04-2006        5
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这是在同一日期针对不同ID的多个条目的面板数据.我想要做的是填写每个ID的缺失日期.您可以看到,对于ID"1",第二个和第三个条目之间的月份会有一个跳跃.

我想要一个看起来像这样的数据框:

ID      DATE         VALUE
1    31-01-2006        5
1    28-02-2006        5
1    31-03-2006        NA
1    30-04-2006        NA
1    31-05-2006        10
1    30-06-2006        11
2    31-01-2006        5
2    31-02-2006        5
2    31-03-2006        5
2    31-04-2006        5
Run Code Online (Sandbox Code Playgroud)

我不知道怎么做,因为我不能按日期索引,因为有重复的日期.

python pandas pandas-groupby

7
推荐指数
1
解决办法
348
查看次数