2016-06-21 1 views
1

私はデータフレームを持っており、行の順序を乱さずに2つの行を合計しようとしています。pandas:データフレームを並べ替えることなく2行のデータフレームを合計しますか?

> test = {'counts' : pd.Series([10541,4143,736,18,45690], index=['Daylight','Dawn','Other/unknown','Uncoded & errors','Total']), 'percents' : pd.Series([23.07,9.07,1.61,0.04,100], index=['Daylight','Dawn','Other/unknown','Uncoded & errors','Total'])} 

> testdf = pd.DataFrame(test) 

        counts percents 
Daylight   10541  23.07 
Dawn    4143  9.07 
Other/unknown  736  1.61 
Uncoded & errors  18  0.04 
Total    45690 100.00 

私はこの出力をしたい:

    counts percents 
Daylight   10541  23.07 
Dawn    4143  9.07 
Other/unknown  754  1.65 <-- sum of 'other/unknown' and 'uncoded & errors' 
Total    45690 100.00 

これは私が得ることができました限り近い:

> sum_ = testdf.loc[['Other/unknown', 'Uncoded & errors']].sum().to_frame().transpose() 

    counts percents 
0 754.00 1.65  

> sum_ = sum_.rename(index={0: 'Other/unknown'}) 

       counts percents 
Other/unknown 754.00 1.65 

> testdf.drop(['Other/unknown', 'Uncoded & errors'],inplace=True) 
> testdf = testdf.append(sum_) 

Daylight   10541 23.07 
Dawn    4143 9.07 
Total   45690 100 
Other/unknown 754 1.65 

をしかし、これは、元の行の順序を保持していません

データフレームをスライスし、 'Dawn'と 'Total'の間にsum_ rowを挿入することで行を挿入できますが、これはn行ラベルが変更されたり、行の順序が変更されたりする場合は、作業を中止してください(これは年次パンフレットなので、テーブルデザインは毎年変更される可能性があります)。

答えて

2

使用groupby(..., sort=False).sum()

In [84]: (testdf.reset_index() 
    ....:  .replace({'index': {'Uncoded & errors':'Other/unknown'}}) 
    ....:  .groupby('index', sort=False).sum() 
    ....:) 
Out[84]: 
       counts percents 
index 
Daylight   10541  23.07 
Dawn    4143  9.07 
Other/unknown  754  1.65 
Total    45690 100.00 
1

私はMaxUの答えを好むが、あなたはまた、インプレースの加算試すことができます。その後、

testdf.loc['Other/unknown'] += testdf.loc['Uncoded & errors'] 

とインデックスで行を削除:

testdf.drop(['Uncoded & errors'], inplace=True) 

In [28]: testdf 
Out[28]: 
       counts percents 
Daylight   10541  23.07 
Dawn    4143  9.07 
Other/unknown  754  1.65 
Total    45690 100.00 
関連する問題