我有一个简单的任务,我想知道是否有更好/更有效的方法.我有一个如下所示的数据框:
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)
是否有更好/更清晰的方法将这些值直接添加到数据框?
谢谢您的帮助.
我有以下数据帧:
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) 给出以下内容 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) 我有一个简单的偏移问题,我似乎无法在之前的其他帖子中找到答案.我想在几周之内进行分组,但是默认情况下df.groupby(pd.TimeGrouper('1W'))我会在周日开始给我.
比方说,我希望这个groupby在星期二开始.我试图天真地添加pd.DateOffset(days=2)作为一个额外的参数,但似乎没有用.
我有以下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 …
我有一个数据帧如下:
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) 我有一个像这样的数据框
>>> 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=-1和session=4的user_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)
我怎样才能做到这一点?
我经常在关系数据库中的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)
在熊猫队有什么办法吗?
我有一个数据框
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比熊猫解决方案更快?
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) 想象一下,我有一个看起来像这样的数据框:
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)
我不知道怎么做,因为我不能按日期索引,因为有重复的日期.
pandas ×10
pandas-groupby ×10
python ×10
dataframe ×3
group-by ×2
duplicates ×1
group-concat ×1
offset ×1
unique ×1