2016-06-01 1 views
3

Это из образца CSVГраф частоты числа в колонке время составляет текст в другой колонке

Примерно это выглядит так 5 колонок

Clipboard:

Year Course Modul Q1 Q2 
2015 Physics CS1203 4 2 
2015 Physics CS1203 4 3 
2015 Physics CS1203 3 1 
2015 Physics CS1203 4 4 
2015 English IR0001 2 5 
2015 English IR0001 1 2 
2015 English IR0001 3 1 
2015 English IR0001 5 3 
2015 English IR0001 4 3 

Код:

df = pd.read_clipboard() 

Я сгруппирован по модулю, теперь хочу подсчитать число 4s в модуле CS1203. Я новичок в этом, поэтому извините, если это глупый вопрос. Я действительно ценю твою помощь.

Спасибо

+0

Можете ли вы добавить изображение в текст, чтобы ответить? – jezrael

ответ

2

Я думаю, что вам нужно boolean indexing:

print (df[(df.module == 'CS1203') & (df.q1 == 4)]) 
    year course module q1 q2 
0 2015 Physics CS1203 4 2 
1 2015 Physics CS1203 4 3 
3 2015 Physics CS1203 4 4 

print (len(df[(df.module == 'CS1203') & (df.q1 == 4)])) 
3 

Если нужно рассчитывать во всех q колонн первого использования melt:

df = pd.melt(df, id_vars=['year','course','module'], value_name='q') 
    year course module q1 q2 
0 2015 Physics CS1203 4 2 
1 2015 Physics CS1203 4 3 
2 2015 Physics CS1203 3 1 
3 2015 Physics CS1203 4 4 
4 2015 English IR0001 2 5 
5 2015 English IR0001 1 2 
6 2015 English IR0001 3 1 
7 2015 English IR0001 5 3 
8 2015 English IR0001 4 3 

print (df[(df.module == 'CS1203') & (df.q == 4)]) 
    year course module variable q 
0 2015 Physics CS1203  q1 4 
1 2015 Physics CS1203  q1 4 
3 2015 Physics CS1203  q1 4 
12 2015 Physics CS1203  q2 4 

print (len(df[(df.module == 'CS1203') & (df.q == 4)])) 
4 
+0

Спасибо jezrael – EricJames

+0

Спасибо @jezrael за вашу помощь вчера, вы ответили очень полезно. Однако я столкнулся с другой проблемой и буду очень благодарен за вашу помощь. Вышеупомянутый файл csv - я хочу создать функцию - когда мы запускаем скрипт, он просит ввести код модуля. Если код модуля равен нашему модулю в списке, чем суммарная длина 4 и 5 и делить на общее число * 100. Когда пользователь вводит код модуля, сценарий должен возвращать процентное значение. Можете ли вы мне помочь, как я могу это сделать? Я действительно ценю твою помощь. – EricJames

2

вы можете сначала отфильтровать DF модулем (df.module == 'CS1203'), затем отфильтруйте столбцы, выбрав только те, которые соответствуют q\d+ RegEx, выберите только 4 s и, наконец, вычислить сумму:

In [74]: (df[df.module == 'CS1203'].filter(regex=r'q\d+') == 4).sum() 
Out[74]: 
q1 3 
q2 1 
dtype: int64 
1

Может быть, вы можете попробовать что-то вроде этого:

df.groupby(['module','q1'])['module'].agg({'Frequency':'count'}) 

Пожалуйста, обратитесь к этой post.