我正在尝试根据年份按不同的列进行分组并申请同一年,最后将结果存储在.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
file中,但我需要根据同年DWWC1980
计算DWWC1985
and Income_Cat
的总和,因此结果应为:
Income_Cat DWWC1980 DWWC1985
H 40 75
L 5 0
LM 45 10
UM 0 40
并将输出存储在一个.csv
文件中。
如果我理解了这个问题,这个shoudld会产生所需的输出
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]]
代码应如下所示:
#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个,但我希望这个片段有用。
猜猜你需要这个。
输入:
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
s。转换为整数是获得所需数据帧的最后一步