如何按不同的列分组

时间:2019-03-28 09:54:42

标签: python pandas pandas-groupby

我试图根据年份对不同的列进行分组,并申请同一年,最后将结果存储在.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计算DWWC1985Income_Cat的总和,因此结果应为:

Income_Cat   DWWC1980 DWWC1985  
    H            40       75
    L            5        0
    LM           45       10
    UM           0        40

并将输出存储在一个.csv文件中。

3 个答案:

答案 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。转换为整数是到达所需数据帧的最后一步