2016-06-29 3 views
4

私のアイテムの売上レートを含むPandas Dataフレームの行があります。パンダ:特定の行をパーセンテージに変更する

私のデータを見て:

block_combine 
Out[78]: 
END_MONTH   1 2 3 4 5 
Total Listings 168 219 185 89 112 
Total Sales  85 85 84 41 46 

私は簡単に次のようにして、販売%を計算することができます。

block_combine.loc["Total Sales Rate"] = block_combine.ix[1,:]/block_combine.ix[0,:] 
block_combine 

Out[79]: 
END_MONTH     1   2   3   4   5 
Total Listings 168.000000 219.000000 185.000000 89.000000 112.000000 
Total Sales  85.000000 85.000000 84.000000 41.000000 46.000000 
Total Sales Rate 0.505952 0.388128 0.454054 0.460674 0.410714 

今、私がしようとしています、何が「総売上高を変更することです「レート」の行をの整数パーセントに変更します。私はそれが行だった場合はこれを行うことができますが、私は行を扱うときに問題にぶつかります。ここで

は、私が試みたものです:

block_combine.loc["Total Sales Rate"] = pd.Series(["{0:.0f}%".format(val * 100) for val in block_combine.loc["Total Sales Rate"]]) 


block_combine 

Out[81]: In [82]: 
END_MONTH   1 2 3 4  5 
Total Listings 168 219 185 89 112.0 
Total Sales  85 85 84 41 46.0 
Total Sales Rate 39% 45% 46% 41% NaN 

計算はオフ/左にシフトしています。 1ヶ月間の販売率は、実際には2ヶ月間の販売率(39%)です。

答えて

6

あなたは.apply('{:.0%}'.format)使用できる:

import pandas as pd 

df = pd.DataFrame([(168,219,185,89,112), (85,85,84,41,46)], 
        index=['Total Listings', 'Total Sales'], columns=list(range(1,6))) 
df.loc['Total Sales Rate'] = ((df.loc['Total Sales']/df.loc['Total Listings']) 
           .apply('{:.0%}'.format)) 

print(df) 

収率

    1 2 3 4 5 
Total Listings 168 219 185 89 112 
Total Sales  85 85 84 41 46 
Total Sales Rate 51% 39% 45% 46% 41% 

注意パイソンstr.format方法は、固定された( 'F')フォーマットで100と表示することによって数を乗算built-in % formatを有すること、パーセント記号が続きます。


Pandas DataFrameの列には1つのdtypeが必要であることに注意してください。 1つの値を文字列に変更すると、列全体が のdtypeを汎用objectdtypeに変更します。したがって、 Total ListingsおよびTotal Sales行のint64またはint32は、平文Python intsとして再作成されます。この は、パンダがネイティブのNumPy dtype(int64またはfloat64 - objectなど)でしか動作しない高速のNumPyベースの数値演算 を利用できないようにします。

上記のコードが目的の外観に達している間に、さらに計算がDataFrameで実行される場合は を使用することはお勧めできません。代わりに、 を最後の文字列に変換するだけで、プレゼンテーションを行う必要があります。

あるいは、Total Sales Rate文字列は、列、行ないにしているので、あなたのデータフレームをトランスポーズ:

import pandas as pd 

df = pd.DataFrame([(168,219,185,89,112), (85,85,84,41,46)], 
        index=['Total Listings', 'Total Sales'], columns=list(range(1,6))).T 

df['Total Sales Rate'] = ((df['Total Sales']/df['Total Listings']) 
           .apply('{:.0%}'.format)) 

print(df) 

利回り

Total Listings Total Sales Total Sales Rate 
1    168   85    51% 
2    219   85    39% 
3    185   84    45% 
4    89   41    46% 
5    112   46    41% 

なぜ

block_combine.loc["Total Sales Rate"] = pd.Series(["{0:.0f}%".format(val * 100) for val in block_combine.loc["Total Sales Rate"]]) 
理由

新しいシリーズに0から1で始まるインデックスがあるため、値を1列分左にシフトしました。Pandas block_combine.loc["Total Sales Rate"]に値を割り当てる前に、block_combine.loc["Total Sales Rate"]のインデックスを持つ右のシリーズのインデックスを整列させます。

したがって、あなたは、代わりに使用している可能性:

block_combine.loc["Total Sales Rate"] = pd.Series(["{0:.0f}%".format(val * 100) 
    for val in block_combine.loc["Total Sales Rate"]], 
    index=block_combine.columns) 
0
df = pd.DataFrame({ 
     1: [168,85], 
     2: [219,85], 
     3: [185,84], 
     4: [89,41], 
     5: [112,46] 
    }, index=['Total Listings', 'Total Sales']) 

total_sales_rate = pd.Series(df.loc['Total Sales']/df.loc['Total Listings'] * 100, name='Total Sales Rate').round() 
df = df.append(total_sales_rate) 

結果...

    1 2 3 4 5 
Total Listings 168 219 185 89 112 
Total Sales  85 85 84 41 46 
Total Sales Rate 51 39 45 46 41 
関連する問題