【问题标题】:Finding the category with highest proportion meeting a criterion in Pandas在 Pandas 中找到符合标准的比例最高的类别
【发布时间】:2014-03-26 22:54:46
【问题描述】:

我有一些simple data 的表格

>>> gerber.head()

  sex   yob  voting  hawthorne  civicduty  neighbors  self  control
0    0  1941       0          0          1          0     0        0
1    1  1947       0          0          1          0     0        0
2    1  1982       1          1          0          0     0        0
3    1  1950       1          1          0          0     0        0
4    0  1951       1          1          0          0     0        0

并希望找到投票者比例最高的类别(即布尔值列)(即voting == 1在类别中的比例最高)。我可以这样做

gerber.groupby('voting').sum().apply(lambda x: x/x.sum()).iloc[1]

生成一个简单的表格

sex          0.309893
yob          0.315449
hawthorne    0.322375
civicduty    0.314538
neighbors    0.377948
self         0.345151
control      0.296638
Name: 1, dtype: float64

我可以检查给我我想要的东西。这是我正在寻找的数据,但必须有 (a) 一种使用 Python 和 Pandas 表达这一点的更好方法,以及 (b) 一种仅返回类别名称的方法(此处为“邻居”)。

如何使用 Pandas 在 Python 中简洁地表达这一点?

【问题讨论】:

  • 你能澄清一下“选民比例最高的类别”是什么意思吗?
  • @8one6:每列1的比例;所以这里是“邻居”。
  • 这对yob 列有什么作用?
  • 好的。请参阅下面的符合这些 cmets 的答案。
  • 您的解决方案(上图)将非常奇怪地受到yob 列的影响,因为其中包含如此多的数字...您是否对上面的确切代码给出了您想要的结果感到满意当应用于您链接到的确切文件时?

标签: python pandas indexing aggregate dataframe


【解决方案1】:

我认为您可以使用均值更直接地做到这一点。另外,我认为与其对每个组进行 groupby 然后提取一行,我会使用 get_group 来获取投票 = 1 的子组并取平均值:

df1.groupby('voting').get_group(1).mean()

或者只是得到邻居:

df1.groupby('voting').get_group(1)['neighbors'].mean()
# equivalent: df1.groupby('voting')['neighbors'].get_group(1).mean()

要获得最大的类别,请使用idxmax

df1.groupby('voting').get_group(1).mean().idxmax()

【讨论】:

  • 我已经编辑了这个问题,以明确我在寻找什么。
  • 这不是吗?将有助于为所需输出提供示例输入,否则难以复制!
  • 数据链接在问题中。输出应该是“邻居”,基于 0.377948 > 0.345151 > 0.322375 > 0.314538 > 0.296638 的事实。
  • @raxacoricofallapatorius 哦,你正在寻找 idxmax 所以:df1.groupby('voting').get_group(1).mean().idxmax()
【解决方案2】:
import pandas as pd
gerber = pd.read_csv('gerber.csv')
max(gerber[gerber.voting == 1].ix[:,3:6])

【讨论】:

    【解决方案3】:

    我不确定如何考虑您对yob 专栏提出的问题。听起来您想要:查看voting==1 所在的行,然后仅在这些数据中计算其他列中1 的分数(不包括voting 本身和yob)。然后,您要确定分数最高的列。

    我认为这可行:

    gerber[gerber['voting']==1].mean().drop(['voting', 'yob']).argmax()
    

    【讨论】:

    • 对不起,我很不清楚:布尔值列之一中的“类别”。我正在寻找的是哪个类别的 1 比例最高(即,对于每个类别,计算该类别中 1 的比例)。我的代码可以做到这一点,但必须有更好的方法。
    • 我已经编辑了这个问题,以便更清楚地了解我在寻找什么(我希望如此)。很抱歉造成混乱。
    • 评论在上面...听起来你现在在问:仅限于 voting==1 所在的行,另一列包含另一列中 1 的最高比例列。那正确吗?在回答该问题时,您希望如何处理 yob 列。它的数据与您其他列的数据明显不同。
    猜你喜欢
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 2021-05-04
    • 2016-01-22
    相关资源
    最近更新 更多