我有一個數據框df1
,其中包含有關企業的信息。每一行都是一項業務。 G列有業務編號,列R和Z(以及其他)有整數,告訴我不同的收入衡量標準。 A列有年份。我想創建一個新的數據框,每個業務只有一行,並且不同年份的值合起來。假設列B-Q每年不改變,但是R和Z不會改變。如何在幾年內將數據彙總到一個數據框中
爲了實現這個目標,我正在做df1.groupby("G", as_index=False)["Z"].sum()
以獲得Z
列的總收入。我會同樣做df1.groupby("G", as_index=False)["R"].sum()
等等。
我希望最終的數據框叫df2
有一行每個企業與df1
所有列不會改變一年,也是新的總和列。下面的代碼是我的嘗試,但它是不正確的。問題是我不明白如何將groupby的結果添加到列。
df2['SumZ'] = df.groupby("G")["Z"].sum()
df2['SumR'] = df.groupby("G")["R"].sum()
df2['RZ'] =df2['SumR']/df2['SumZ']
一種方法是創建一個新的數據框df2與B-Q列的副本,說,然後將這些列添加到它。
如何做到這一點?我嘗試創建一個新的數據框然後添加列失敗。
這是我的完整代碼。
from __future__ import division
import sys
import pandas as pd
inputfile = sys.argv[1]
city = sys.argv[2]
xl = pd.ExcelFile(inputfile)
df1 = xl.parse(xl.sheet_names[0], skiprows=4,skip_footer=9)
df1.columns = [chr(65+i) for i in xrange(len(df1.columns))]
df1.replace('*', 3, inplace=True)
df1 = df1.convert_objects(convert_numeric=True)
for c in ['R', 'T', 'V', 'X', 'Z']:
df1[c] = df1[c].astype(int)
for c in ['B','E', 'H', 'J', 'O', 'Q', 'S', 'U', 'W', 'Y']:
df1.pop(c)
print "Read in..."
#Now attempt and fail to make a new dataframe summarized by year
df2['SumZ'] = df1.groupby("G", as_index=False)["Z"].sum()
df2['SumR'] = df1.groupby("G", as_index=False)["R"].sum()
這做什麼,我需要,但看起來非常難看。
summary_data = df1[['G', 'R','T', 'V', 'X', 'Z']].groupby('G').sum()
constant_data = df1.drop(['R', 'T', 'V', 'X', 'Z'], axis=1).groupby('G').first()
df2 = summary_data.join(constant_data)