2015-07-09 2 views
0

В настоящее время есть файл CSV, который выводит dateframe следующим образом:New панда dataframe из метаинформации существующего DF

[in] 
df = pd.read_csv(file_name) 
df.sort('TOTAL_MONTHS', inplace=True) 
print df[['TOTAL_MONTHS','COUNTEM']] 

[out] 
    TOTAL_MONTHS  COUNTEM 
    12     0 
    12     0 
    12     2 
    25     10 
    25     0 
    37     1 
    68     3 

Я хочу, чтобы получить общее количество строк (по TOTAL_MONTHS), для которых «COUNTEM» значение попадает в предустановленный бит.

Данные будут введены в гистограмму с помощью Excel/PowerPoint с:

оси Х = Количество контрактов

Y-оси = Total_months

Какого цвета бар = COUNTEM

вход графа, как это (столбцы, являющиеся COUNTEM бункеров):

MONTHS 0 1-3 4-6 7-10 10+ 20+ 
0   0 0  0  0  0  0 
1   0 0  0  0  0  0 
2   0 0  0  0  0  0 
3   0 0  0  0  0  0 
... 
12  2 1  0  0  0  0 
... 
25  1 0  0  0  1  0 
... 
37  0 1  0  0  0  0 
... 
68  0 1  0  0  0  0 

В идеале я хотел бы, чтобы код выводил данные в этом формате.

ответ

2

Интересная проблема. Зная панды (как я не правильно), может быть гораздо более приятное и более простое решение этого. Однако, делая это через итерации также можно следующим образом:

#First, imports and create your data 
import pandas as pd 

DF = pd.DataFrame({'TOTAL_MONTHS' : [12, 12, 12, 25, 25, 37, 68], 
        'COUNTEM'  : [0, 0, 2, 10, 0, 1, 3] 
        }) 

#Next create a data frame of 'bins' with the months as index and all 
#values set at a default of zero 
New_DF = pd.DataFrame({'bin0' : 0, 
         'bin1' : 0, 
         'bin2' : 0, 
         'bin3' : 0, 
         'bin4' : 0, 
         'bin5' : 0}, 
         index = DF.TOTAL_MONTHS.unique()) 

In [59]: New_DF 
Out[59]: 
    bin0 bin1 bin2 bin3 bin4 bin5 
12  0  0  0  0  0  0 
25  0  0  0  0  0  0 
37  0  0  0  0  0  0 
68  0  0  0  0  0  0 

#Create a list of bins (rather than 20 to infinity I limited it to 100) 
bins = [[0], range(1, 4), range(4, 7), range(7, 10), range(10, 20), range(20, 100)] 

#Now iterate over the months of the New_DF index and slice the original 
#DF where TOTAL_MONTHS equals the month of the current iteration. Then 
#get a value count from the original data frame and use integer indexing 
#to place the value count in the appropriate column of the New_DF: 

for month in New_DF.index: 
    monthly = DF[DF['TOTAL_MONTHS'] == month] 
    counts = monthly['COUNTEM'].value_counts() 
    for count in counts.keys(): 
     for x in xrange(len(bins)): 
      if count in bins[x]: 
       New_DF.ix[month, x] = counts[count] 

Который дает мне:

In [62]: New_DF 
Out[62]: 
    bin0 bin1 bin2 bin3 bin4 bin5 
12  2  1  0  0  0  0 
25  1  0  0  0  1  0 
37  0  1  0  0  0  0 
68  0  1  0  0  0  0 

Который, кажется, что вы хотите. Вы можете переименовать индекс по своему усмотрению.

Надеюсь, что это поможет. Возможно, у кого-то есть решение, которое использует встроенную функцию pandas, но пока это, похоже, работает.

Смежные вопросы