更新
如果使用 to_frame(),列名称似乎不在同一行
重量
型号
HG-R2075 2040
HG220 680
这是我的代码,它将“型号”(表示类型)分组,并获得“重量”(重量)的总和并排除列(“是否发送”),其中包含值。
import pandas as pd
import numpy as np
import sys
import os
script_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(script_dir ) # change to the path that you already know
try:
ClientName = sys.argv[1]
except :
print(u'没有输入或者错误的客户名称!')
df = pd.read_excel("Summary.xlsm")
df = df[df['客户'].str.contains(ClientName)][pd.isnull(df[u"是否已经发送"])].groupby([ u'型号'])[u'重量'].sum()
print('[CQ:face,id=21] ' + '*' * 10 + u'以下是' + ClientName + u'未发送的重量' + '*' * 10 + '[CQ:face,id=21]')
print(str(df))
输出是这样的:
[CQ:face,id=21] **********以下是KATUN未发送的重量**********[CQ:face,id=
21]
型号 (****the column name is missing here*****)
HG-R2075 2040
HG220 680
Name: 重量, dtype: int64
我不知道为什么缺少列名?
我想要的输出是:如何制作它?
型号 重量
HG-R2075 2040
HG220 680
Name: 重量, dtype: int64
答案 0 :(得分:3)
df
操作的结果groupby
实际上是一个系列,而不是一个DataFrame。这就是为什么它以不同的格式打印。
print(df.to_frame())
应该诀窍。
编辑:实际上在这样的数据框索引中,名称和列名不会打印在同一行上。要获得更清晰的输出,请使用reset_index
获取2个正确的列:
print(df.reset_index().to_string(index=False))
答案 1 :(得分:1)
首先使用&
链接boolean indexing
。
如果需要2列DataFrame
添加as_index=False
或Series.reset_index
:
mask = df['客户'].str.contains(ClientName) & df[u"是否已经发送"].isnull()
df = df[mask].groupby([ u'型号'], as_index=False)[u'重量'].sum()
或者:
df = df[mask].groupby([ u'型号'])[u'重量'].sum().reset_index()
对于一列DataFrame
使用Series.to_frame
- 第一列为index
:
df = df[mask].groupby([ u'型号'])[u'重量'].sum().to_frame()
样品:
np.random.seed(345)
N = 10
df = pd.DataFrame({'客户':np.random.choice(list('abc'), size=N),
u"是否已经发送":np.random.choice([np.nan,0], size=N),
u'型号':np.random.randint(2, size=N),
u'重量':np.random.randint(10, size=N)})
print (df)
型号 客户 是否已经发送 重量
0 0 a 0.0 4
1 0 a 0.0 0
2 1 b NaN 8
3 1 b NaN 5
4 1 c 0.0 6
5 1 a NaN 3
6 1 a NaN 3
7 1 b 0.0 4
8 0 a NaN 2
9 1 c NaN 8
ClientName = 'a'
mask = df['客户'].str.contains(ClientName) & df[u"是否已经发送"].isnull()
df1 = df[mask].groupby([ u'型号'], as_index=False)[u'重量'].sum()
print(df1)
型号 重量
0 0 2
1 1 6
df1 = df[mask].groupby([ u'型号'])[u'重量'].sum().reset_index()
print(df1)
型号 重量
0 0 2
1 1 6
df2 = df[mask].groupby([ u'型号'])[u'重量'].sum().to_frame()
print (df2)
重量
型号
0 2
1 6