熊猫:查询DataFrame - 多个标准

时间:2016-11-11 00:13:35

标签: python pandas

我有一个大型DataFrame,其中两列是:

  • 问题代码(例如Q453)
  • 是或否表示问题是否得到正确回答

我不知道所有可能的问题代码,每个问题都已多次回答。类似的东西:

Q666正确

Q463 True

Q056 True

Q666错误

我希望知道哪个问题最容易,哪个问题的答案尝试次数最高。 使用pandas实现这一目标的步骤是什么?

1 个答案:

答案 0 :(得分:0)

我刚刚发布了你帖子中的数据样本。这是你正在寻找的吗?

我将true / false指示符设为小写字符串;不确定它们存储在您的文件中。如果您使用的是python2,我相信您可以将from io import StringIO更改为from StringIO import StringIO

In [105]: import pandas as pd
     ...: from io import StringIO
     ...:
     ...: data = """Q666 True
     ...:
     ...: Q463 True
     ...:
     ...: Q056 True
     ...:
     ...: Q666 False
     ...: Q666 True
     ...:
     ...:
     ...: Q463 True
     ...:
     ...: Q056 True
     ...: Q666 False
     ...: Q463 False
     ...: Q666 False"""
     ...:

In [106]: df = pd.read_csv(StringIO(data), sep=" ", header=None)

In [107]: df.columns = [['question', 'answer']]

In [108]: df['answer'] = df['answer'].astype("str").apply(lambda x: x.lower())

In [109]: df
Out[109]:
  question answer
0     Q666   true
1     Q463   true
2     Q056   true
3     Q666  false
4     Q666   true
5     Q463   true
6     Q056   true
7     Q666  false
8     Q463  false
9     Q666  false

为数据帧分配一个常量值,这样我们就可以根据条件对group进行计数,然后将multiindex移回我们需要的位置。

In [110]: piv = (df
     ...:        .assign(val = 1)
     ...:        .groupby(["question", "answer"])
     ...:        .count()
     ...:        .unstack()['val'])

从这里开始很容易......

In [111]: piv['ratio'] = piv['true'] / piv.sum(axis=1)

In [112]: piv.sort_values("ratio")
Out[112]:
answer    false  true     ratio
question
Q666        3.0   2.0  0.400000
Q463        1.0   2.0  0.666667
Q056        NaN   2.0  1.000000