如何按不同列分组

问题描述 投票:1回答:3

我正在尝试根据年份按不同的列进行分组并申请同一年,最后将结果存储在.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

并将输出存储在不同的.csvfile中,但我需要根据同年DWWC1980计算DWWC1985and Income_Cat的总和,因此结果应为:

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

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

python pandas pandas-groupby
3个回答
1
投票

如果我理解了这个问题,这个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]]

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
投票

猜猜你需要这个。

输入:

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)用零填充NaNs。转换为整数是获得所需数据帧的最后一步

© www.soinside.com 2019 - 2024. All rights reserved.