我试图根据年份对不同的列进行分组,并申请同一年,最后将结果存储在.csv文件中。
我的数据和代码是:
ISO3 Income_Cat_1980 Income_Cat_1985 DWWC1980 DWWC1985
AFG L LM 5 10
AGO LM H 15 25
ALB LM UM 30 40
ARE H H 40 50
for i in range (1980,1990,5):
df=pd.DataFrame(pd.read_csv("mydata.csv"))
df=df.groupby("Income_Cat_"+str(i)).sum()
print df
df.to_csv('country-surplus'+str(i)+'.csv',index="Income_Cat_"+str(i))
我的代码结果是:
Income_Cat_1980 DWWC1980 DWWC1985
H 40 50
L 5 10
LM 45 65
Income_Cat_1985 DWWC1980 DWWC1985
H 55 75
LM 5 10
UM 30 40
并将输出存储在不同的.csv
文件中,但是我需要根据同一年DWWC1980
计算DWWC1985
和Income_Cat
的总和,因此结果应为:
Income_Cat DWWC1980 DWWC1985
H 40 75
L 5 0
LM 45 10
UM 0 40
并将输出存储在一个.csv
文件中。
答案 0 :(得分:1)
代码应如下所示:
#You should only be loading the data once
df=pd.DataFrame(pd.read_csv("mydata.csv"))
dfl = []
for i in range (1980,1990,5):
temp = df.groupby("Income_Cat_"+str(i))[['DWWC' + str(i)]].sum()
temp.index.rename('Income_Cat', inplace=True)
dfl.append(temp)
out = pd.concat(dfl, sort=False).fillna(0)).groupby('Income_Cat').sum()
out.to_csv('country-surplus'+str(i)+'.csv',index="Income_Cat')
输出与您所描述的不完全相同,因为其索引包括所有6个收入类别。我不明白为什么您只需要其中4个,但希望该片段对您有所帮助。
答案 1 :(得分:1)
如果我理解这个问题,这应该产生期望的输出
init = True
for i in range(1980,1990,5):
_df = df[["Income_Cat_"+str(i), 'DWWC'+str(i)]]
_df=_df.groupby("Income_Cat_"+str(i)).sum()
if init:
out = _df
init=False
else:
out = out.merge(_df, how='outer', left_index=True, right_index=True)
out.fillna(0, inplace=True)
out.index.rename('Income_cat', inplace=True)
您可以通过将循环内的第一行替换为:
_df = df[[a for a in df.columns if str(i) in a]]
答案 2 :(得分:1)
猜你需要这个。
输入:
df
ISO3 Income_Cat_1980 Income_Cat_1985 DWWC1980 DWWC1985
0 AFG L LM 5 10
1 AGO LM H 15 25
2 ALB LM UM 30 40
3 ARE H H 40 50
使用以下代码
pd.concat([df.groupby('Income_Cat_' + str(year)).sum()['DWWC' + str(year)]
for year in range(1980,1986) if 'Income_Cat_' + str(year) in
df.columns],1).fillna(0).astype(int)
输出
DWWC1980 DWWC1985
H 40 75
L 5 0
LM 45 10
UM 0 40
说明:
pd.concat([list of series],1)
沿索引连接pd.Series
。如果一个pd.Series
(列名称为series1
,但没有另一个索引i
,则结果数据框中的单元格将获得值NaN
,因此:
print(df.loc[i, series1])
产生NaN
。因此,我们使用fillna(0)
用零填充NaN
。转换为整数是到达所需数据帧的最后一步