为什么组中的pandas输出中的列名缺少结果?

时间:2017-07-02 13:01:57

标签: pandas

更新

如果使用 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 

2 个答案:

答案 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=FalseSeries.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