2016-06-29 166 views
4

我在Pandas數據框中有一行,其中包含我的項目的銷售率。熊貓:將特定的行更改爲百分比

看看我的數據:

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% 

注意,Python的str.format方法具有built-in % format其在固定( 'F')格式100和顯示相乘的數量,接着是百分號。


請務必注意,Pandas DataFrame列必須具有單個dtype。將一個值更改爲字符串會強制整列將其dtype更改爲object dtype。因此,行中的int64s或int32s中的 Total ListingsTotal Sales行被重新渲染爲普通的Python ints。這個 可以防止Pandas利用基於NumPy的快速數值運算 ,這些操作僅適用於本地NumPy dtypes(如int64float64 - 不是 object)。

因此,雖然上面的代碼實現了所需的外觀,但如果在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開始。在給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 
相關問題