通过值重新格式化pandas DataFrame计数

时间:2019-03-19 07:57:28

标签: python pandas

从Moodle调查中,我得到下一个DataFrame

# -*- coding: utf-8 -*-

import pandas as pd

data = pd.DataFrame({
    "Id":[0, 1, 2, 3, 4, 5],
    "App ABAP": ["Aucune expérience", "Aucune expérience", "en Bachelor", "Aucune expérience", "Aucune expérience", "en Bachelor"], # where did you learn
    "Exp ABAP": ["Aucune expérience", "Aucune expérience", "1 semestre de pratique", "Aucune expérience", "Aucune expérience", "1 semestre de pratique"], # how long did you practice
    "Autre": ["-", "Arduino", "-", "-", "-", "-"],
    "App Autre": ["Aucune expérience", "en Bachelor", "Aucune expérience", "Aucune expérience", "Aucune expérience", "Aucune expérience"],
    "Exp Autre": ["Aucune expérience", "1 an de pratique", "Aucune expérience", "Aucune expérience", "Aucune expérience", "Aucune expérience"],
    "App Python": ["en Bachelor", "en Terminale,; en Bachelor,; dans un autre cadre", "Aucune expérience", "en Bachelor", "Aucune expérience", "en Bachelor"],
    "Exp Python": ["1 semestre de pratique", "1 semestre de pratique", "Aucune expérience", "1 semestre de pratique", "Aucune expérience", "1 semestre de pratique"],
    })

对于每种语言,我想按Xp值进行计数:

| Exp                    | ABAP | Autre | Python |
|------------------------|------|-------|--------|
| Aucune expérience      | 4    | 5     | 2      |
| 1 semestre de pratique | 2    | 0     | 4      |
| 1 an de pratique       | 0    | 1     | 0      |

大熊猫有什么办法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用DataFrame.filter使所有以正则表达式Exp开头的列(^是字符串的开头),然后用value_counts调用DataFrame.apply并最后将NaN s转换为0,并转换为整数:

df = data.filter(regex='^Exp').apply(pd.value_counts).fillna(0).astype(int)
print (df)
                        Exp ABAP  Exp Autre  Exp Python
1 an de pratique               0          1           0
1 semestre de pratique         2          0           4
Aucune expérience              4          5           2

编辑:

df = (data.filter(regex='^App')
         .stack()
         .str.split(',;\s+', expand=True)
         .stack()
         .groupby(level=1)
         .value_counts()
         .unstack(0, fill_value=0)
         )
print (df)
                     App ABAP  App Autre  App Python
Aucune expérience           4          5           2
dans un autre cadre         0          0           1
en Bachelor                 2          1           4
en Terminale                0          0           1