我有一个大型DataFrame,其中两列是:
我不知道所有可能的问题代码,每个问题都已多次回答。类似的东西:
Q666正确
Q463 True
Q056 True
Q666错误
我希望知道哪个问题最容易,哪个问题的答案尝试次数最高。 使用pandas实现这一目标的步骤是什么?
答案 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