python-3.x - Pandas 聚合特定列中特定值以外的数据
问题描述
我在pandas dataframe python中有这样的数据
df = pd.DataFrame({
'ID':range(1, 8),
'Type':list('XXYYZZZ'),
'Value':[2,3,2,9,6,1,4]
})
我想要生成的输出是
如何使用 python pandas 数据框生成这些结果。我想包括类型列的所有Y值,并且不想聚合它们。
解决方案
首先过滤值boolean indexing
,聚合并附加过滤掉的行,最后排序:
mask = df['Type'] == 'Y'
df1 = (df[~mask].groupby('Type', as_index=False)
.agg({'ID':'first', 'Value':'sum'})
.append(df[mask])
.sort_values('ID'))
print (df1)
ID Type Value
0 1 X 5
2 3 Y 2
3 4 Y 9
1 5 Z 11
如果想要1
列length of data
的范围ID
:
mask = df['Type'] == 'Y'
df1 = (df[~mask].groupby('Type', as_index=False)
.agg({'ID':'first', 'Value':'sum'})
.append(df[mask])
.sort_values('ID')
.assign(ID = lambda x: np.arange(1, len(x) + 1)))
print (df1)
ID Type Value
0 1 X 5
2 2 Y 2
3 3 Y 9
1 4 Z 11
另一个想法是仅为行创建唯一值的辅助列Y
并按两列聚合:
mask = df['Type'] == 'Y'
df['g'] = np.where(mask, mask.cumsum() + 1, 0)
df1 = (df.groupby(['Type','g'], as_index=False)
.agg({'ID':'first', 'Value':'sum'})
.drop('g', axis=1)[['ID','Type','Value']])
print (df1)
ID Type Value
0 1 X 5
1 3 Y 2
2 4 Y 9
3 5 Z 11
与 Series 类似的替代方案g
,则drop
不需要:
mask = df['Type'] == 'Y'
g = np.where(mask, mask.cumsum() + 1, 0)
df1 = (df.groupby(['Type',g], as_index=False)
.agg({'ID':'first', 'Value':'sum'})[['ID','Type','Value']])
推荐阅读
- shell - 批处理等效于命令输出的 shell
- swift - algolia 过滤器在控制台中有效,但在实际搜索结果中无效
- javascript - 函数 .prev() 和 .closest() 没有按预期工作
- r - 如何使用空代码块创建 R 降价?
- javascript - 将值从 Jquery 库函数传递到 Angular 9 组件函数
- apache-spark - 使用 Spark 每小时使用一个 Kafka 主题
- powershell - PowerShell foreach 未正确迭代
- aws-lambda - 如何在 localstack 上运行 AWS Lambda dotnet
- c# - 将 C# 表达式转换为要在 EF 查询中使用的另一个表达式
- html - 使用浮动左右/宽度 50% 不允许我的内容在移动视图上响应