【问题标题】:A more efficient way to find percentage一种更有效的查找百分比的方法
【发布时间】:2019-07-11 13:30:40
【问题描述】:

从使用 groupby 后的数据框想要识别成功/不成功 速度。虽然我在 Python 和 pandas 方面的知识有限,但我做到了,但看起来效率低下且笨拙。必须有一些更简单有效的方法。任何帮助将非常感激。

BldgID  BldHt   Device  Date      Time     Result
1213    35      758     20181120  105550   OK
1213    35      758     20181120  105540   NG
1112    40      780     20181120  003102   OK
1117    26      790     20181120  002557   OK
1111    65      780     20181120  002102   NG
1214    80      758     20181120  001600   OK
2902    34      780     20181119  005410   OK
1232    90      780     20181119  001410   OK
1222    75      760     20181119  010552   OK
1214    80      758     20181119  010052   OK
1214    80      758     20181119  005553   NG
1246    16      790     20181119  004556   OK
1128    15      758     20181119  004552   OK
1128    15      758     20181119  004552   OK
1211    30      790     20181119  003557   NG
1211    30      790     20181119  003558   OK

这是数据框 (csv)。起初我想将 [BldgID, BldHt, Device] 并找到它们的 Result 百分比,即 OK/OK+NG。我做了什么 是,将“OK”更改为“1”,将“NG”更改为“0”。总结所有的'OK'。要找到 总数(OK + NG),我在更改它们的值之前使用了数据框(1 & 0) 并计算总数。否则,就不算NGThen 将它们除以找到“OK”的百分比。

df = pd.read_csv("data.csv")
df1 = df.groupby(['BldgID','Device'])['Result'].agg('sum').reset_index()
df1 = df.replace({'OK':1, 'NG': 0})
df1 = df1.groupby(['BldgID','Device'])['Result'].agg('sum').reset_index()
df1['NumOKs'] = df1['Result']

# used the original df i.e. change OK=1, NG=0, to count the total num of
# OK+NG
df2 = df.groupby(['BldgID','Device']) 
         ['Result'].agg('count').reset_index()

df2['sum'] = mel_df2['Result']
df2.drop(['Result'], axis=1, inplace=True)

df3 = pd.concat([df1['NumOKs'], df2['sum']], axis=1, keys= 
['NumOKs','sum'])

df3.head(10)
# sum represents OK+NG
       NumOKs     sum
 0       2        2
 1       6        6
 2       2        2
 3       2        2
 4       2        2
 5       3        4
 6       3        3
 7       3        3
 8       2        3
 9       3        3

我得到了我想要的东西,但它看起来非常丑陋且效率低下。但是用我的 知识有限,我必须快速找到一些东西并且它有效。想要 以更好、更简单的方式实现这一目标。 注意:结果可能无法完全复制,因为我剪切粘贴了一个小 部分代码和结果来解释我想要什么以及我是如何(糟糕地)做到的。

【问题讨论】:

  • 您可以使用均值来计算百分比....df.groupby(['BldgID', 'Device'])['Result'].apply(lambda x : (x=='OK').mean()) 这有效吗?

标签: python pandas dataframe


【解决方案1】:

IIUC,尝试使用mean 和布尔条件:

df.groupby(['BldgID', 'Device'])['Result'].apply(lambda x : (x=='OK').mean())

要将其添加到您的数据框:

df['mean_ok'] = df.groupby(['BldgID', 'Device'])['Result']\
                  .apply(lambda x : (x=='OK').mean())

【讨论】:

  • 非常感谢。试了一小部分,似乎工作正常。
  • 如何将名称放入这个新生成的列(4)的平均值,以便像其他人一样访问这个属性?
  • 谢谢。我实际上尝试了完全相同的方法。但不工作。如果我尝试使用相同的 df 名称,那么它会给出以下类型错误:插入的列的索引与帧索引不兼容如果我创建一个新的 df,比如说 df1 = df.groupby(['BldgID', 'Device'])['结果'].apply(lambda x : (x=='OK').mean()) 那么它没有给出错误,但是 df1.head(10) 没有显示新的列名。
  • 添加新列已解决!只是在最后添加 reset_index() 。即 df['mean_ok'] = df.groupby(['BldgID', 'Device'])['Result']\ .apply(lambda x : (x=='OK').mean())。重置索引()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 2021-10-26
  • 2019-08-13
  • 1970-01-01
相关资源
最近更新 更多