2017-07-02 189 views
2

更新爲什麼按結果分組中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 

回答

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 
3

groupby操作的結果df實際上是一個系列,而不是一個數據幀。這就是爲什麼它以不同的格式打印。

print(df.to_frame())應該訣竅。

編輯:其實在這樣一個數據框索引名稱和列名不會被打印在同一行。爲了得到一個乾淨的輸出,使用reset_index拿到2正確列:

print(df.reset_index().to_string(index=False))

+0

更新我的帖子,如果使用to_frame()列名在同一行 – Lee

+0

我編輯我的答案似乎是不。 –

相關問題