2016-06-29 2 views
4

내 품목의 판매율이 포함 된 팬더 데이터 프레임에 행이 있습니다.팬더 : 특정 행을 백분율로 변경

내 데이터에보기 :

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을 가지고, 퍼센트 부호가 뒤 따른다.


팬더 DataFrame 열에는 하나의 dtype이 있어야한다는 점에 유의해야합니다. 한 값을 문자열로 변경하면 전체 열이 dtype을 일반 object dtype으로 변경합니다. 따라서 또는 Total ListingsTotal Sales 행의 int32은 일반 Python ints으로 재 작성됩니다. 이 은 팬더가 기본 NumPy dtype (int64 또는 float64 - object이 아님)에서만 작동하는 빠른 NumPy 기반 숫자 작업 을 활용하지 못하게합니다.

위의 코드가 원하는 모양을 얻는 동안 더 많은 계산이 DataFrame에서 수행되어야한다면 을 사용하는 것은 바람직하지 않습니다. 대신 프레젠테이션을 위해 을 끝에 문자열로 변환해야합니다.

또는 Total Sales Rate 문자열, 컬럼에없는 행 그래서, 양자 택일로, 당신의 DataFrame 트랜스 :

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 
관련 문제