我有一个如下列表.
[['Andrew', '1', '9'], ['Peter', '1', '10'], ['Andrew', '1', '8'], ['Peter', '1', '11'], ['Sam', '4', '9'], ['Andrew', '2', '2']]
Run Code Online (Sandbox Code Playgroud)
我想总结由其他列分组的最后一列.结果是这样的
[['Andrew', '1', '17'], ['Peter', '1', '21'], ['Sam', '4', '9'], ['Andrew', '2', '2']]
Run Code Online (Sandbox Code Playgroud)
这仍然是一个清单.
在实际操作中,我总是想总结由许多其他列分组的最后一列.有没有办法在Python中做到这一点?非常感激.
在对Pandas DataFrame进行分组时,我transform何时应该使用aggregate?何时应该使用?它们在实践中的应用有何不同,您认为哪一个更重要?
这是对此问题的一个后续问题,其中jezrael使用pandas.DataFrame.groupby将列表创建速度提高几百倍.具体来说,让我们df成为一个大型数据帧
index = list(set(df.index))
list_df = [df.loc(x) for x in index]
Run Code Online (Sandbox Code Playgroud)
和
list_df = [x for i,x in df.groupby(level=0, sort=False)]
Run Code Online (Sandbox Code Playgroud)
产生相同的结果,后者比前者快200多倍,甚至忽略了列表创建步骤.为什么?
如果有人能让我理解为什么会有这么大的性能差异,我会很高兴的.提前致谢!
编辑:正如Alex Riley在评论中所建议的,我确认测试是在具有非唯一和非单调索引的数据框架上运行的.
在关于GroupBy对象的新方法的pandas文档的示例中.pipe(),.apply()接受相同lambda 的方法将返回相同的结果.
In [195]: import numpy as np
In [196]: n = 1000
In [197]: df = pd.DataFrame({'Store': np.random.choice(['Store_1', 'Store_2'], n),
.....: 'Product': np.random.choice(['Product_1', 'Product_2', 'Product_3'], n),
.....: 'Revenue': (np.random.random(n)*50+10).round(2),
.....: 'Quantity': np.random.randint(1, 10, size=n)})
In [199]: (df.groupby(['Store', 'Product'])
.....: .pipe(lambda grp: grp.Revenue.sum()/grp.Quantity.sum())
.....: .unstack().round(2))
Out[199]:
Product Product_1 Product_2 Product_3
Store
Store_1 6.93 6.82 7.15
Store_2 6.69 6.64 6.77
Run Code Online (Sandbox Code Playgroud)
我可以看到pipe功能与applyDataFrame对象的不同之处,但不适用于GroupBy对象.有没有人对GroupBy 有什么解释或示例,pipe但没有apply?
我有一个数据框,其中包含日期和公共假期
Date WeekNum Public_Holiday
1/1/2015 1 1
2/1/2015 1 0
3/1/2015 1 0
4/1/2015 1 0
5/1/2015 1 0
6/1/2015 1 0
7/1/2015 1 0
8/1/2015 2 0
9/1/2015 2 0
10/1/2015 2 0
11/1/2015 2 0
12/1/2015 2 0
13/1/2015 2 0
Run Code Online (Sandbox Code Playgroud)
我必须创建一个名为Public_Holiday_Week的条件列,如果该特定周有公共假日,则该列应返回1
我希望看到这样的输出
Date WeekNum Public_Holiday Public_Holiday_Week
1/1/2015 1 1 1
2/1/2015 1 0 1
3/1/2015 1 0 1
4/1/2015 1 0 1
5/1/2015 1 0 1
6/1/2015 1 0 1
7/1/2015 1 0 1
8/1/2015 2 0 …Run Code Online (Sandbox Code Playgroud) 我有一个数据帧df,如下所示:
| date | Revenue |
|-----------|---------|
| 6/2/2017 | 100 |
| 5/23/2017 | 200 |
| 5/20/2017 | 300 |
| 6/22/2017 | 400 |
| 6/21/2017 | 500 |
Run Code Online (Sandbox Code Playgroud)
我需要按月对上述数据进行分组,以获得输出:
| date | SUM(Revenue) |
|------|--------------|
| May | 500 |
| June | 1000 |
Run Code Online (Sandbox Code Playgroud)
我试过这段代码,但它不起作用:
df.groupby(month('date')).agg({'Revenue': 'sum'})
Run Code Online (Sandbox Code Playgroud)
我想只使用Pandas或Numpy而不使用其他库
我有以下数据框架,并希望:
monthQTY_SOLD和NET_AMT每个独特UPC_ID(每月)我想我能做到这一点的方法是1:创建一个month聚合列D_DATES,再总结QTY_SOLD的UPC_ID.
脚本:
# Convert date to date time object
df['D_DATE'] = pd.to_datetime(df['D_DATE'])
# Create aggregated months column
df['month'] = df['D_DATE'].apply(dt.date.strftime, args=('%Y.%m',))
# Group by month and sum up quantity sold by UPC_ID
df = df.groupby(['month', 'UPC_ID'])['QTY_SOLD'].sum()
Run Code Online (Sandbox Code Playgroud)
当前数据框:
UPC_ID | UPC_DSC | D_DATE | QTY_SOLD | NET_AMT
----------------------------------------------
111 desc1 2/26/2017 2 10 (2 x $5)
222 desc2 2/26/2017 3 15
333 …Run Code Online (Sandbox Code Playgroud) 在Python Pandas中,我有一个DataFrame.我按列对此DataFrame进行分组,并希望将列的最后一个值分配给另一列的所有行.
我知道我可以通过此命令选择组的最后一行:
import pandas as pd
df = pd.DataFrame({'a': (1,1,2,3,3), 'b':(20,21,30,40,41)})
print(df)
print("-")
result = df.groupby('a').nth(-1)
print(result)
Run Code Online (Sandbox Code Playgroud)
结果:
a b
0 1 20
1 1 21
2 2 30
3 3 40
4 3 41
-
b
a
1 21
2 30
3 41
Run Code Online (Sandbox Code Playgroud)
如何将此操作的结果分配回原始数据帧,以便我有类似的东西:
a b b_new
0 1 20 21
1 1 21 21
2 2 30 30
3 3 40 41
4 3 41 41
Run Code Online (Sandbox Code Playgroud) MCVE
df = pd.DataFrame({
'Cat': ['SF', 'W', 'F', 'R64', 'SF', 'F'],
'ID': [1, 1, 1, 2, 2, 2]
})
df.Cat = pd.Categorical(
df.Cat, categories=['R64', 'SF', 'F', 'W'], ordered=True)
Run Code Online (Sandbox Code Playgroud)
如您所见,我已经定义了一个有序的分类列Cat.验证,检查;
0 SF
1 W
2 F
3 R64
4 SF
5 F
Name: Cat, dtype: category
Categories (4, object): [R64 < SF < F < W]
Run Code Online (Sandbox Code Playgroud)
我想找到最大的PER ID类别.做groupby+ max工作.
df.groupby('ID').Cat.max()
ID
1 W
2 F
Name: Cat, dtype: object
Run Code Online (Sandbox Code Playgroud)
但我不希望ID成为索引,所以我指定as_index=False.
df.groupby('ID', as_index=False).Cat.max()
ID Cat …Run Code Online (Sandbox Code Playgroud) 我有一个这样的数据框
ID col1 col2
1 Abc street 2017-07-27
1 None 2017-08-17
1 Def street 2018-07-15
1 None 2018-08-13
2 fbg street 2018-01-07
2 None 2018-08-12
2 trf street 2019-01-15
Run Code Online (Sandbox Code Playgroud)
我想过滤col1中的所有“无”并将相应的col2值添加到新列col3中。我的输出看起来像这样
ID col1 col2 col3
1 Abc street 2017-07-27 2017-08-17
1 Def street 2018-07-15 2018-08-13
2 fbg street 2018-01-07 2018-08-12
2 trf street 2019-01-15
Run Code Online (Sandbox Code Playgroud)
谁能帮助我实现这一目标。
pandas ×10
pandas-groupby ×10
python ×10
dataframe ×5
group-by ×4
python-3.x ×2
aggregation ×1
list ×1
numpy ×1
performance ×1