Python 3.x 级数的真值是模糊的。对分类列使用a.empty、a.bool()、a.item()、a.any()或a.all()

Python 3.x 级数的真值是模糊的。对分类列使用a.empty、a.bool()、a.item()、a.any()或a.all(),python-3.x,Python 3.x,我试图根据另一个分类列上的条件得到一列的和 我尝试使用str.contains(),但也没有得到解决方案 类型列具有相等或不相等的值。 COUNT(Z.GENERATE\u BUYLEAD)列是数字列。 DIR\u QUERY\u MCATID列基本上是唯一的ID。 BUYER\u CITY列包含城市名称。 我需要得到COUNT(Z.GENERATE\u BUYLEAD)列的比率(如果Type列包含Equal),除以COUNT(Z.GENERATE\u BUYLEAD)中的所有值之和这里的问题

我试图根据另一个分类列上的条件得到一列的和

我尝试使用
str.contains()
,但也没有得到解决方案

类型列具有相等或不相等的值。
COUNT(Z.GENERATE\u BUYLEAD)
列是数字列。
DIR\u QUERY\u MCATID列基本上是唯一的ID。
BUYER\u CITY
列包含城市名称。


我需要得到
COUNT(Z.GENERATE\u BUYLEAD)
列的比率(如果Type列包含
Equal
),除以
COUNT(Z.GENERATE\u BUYLEAD)

中的所有值之和这里的问题是
x['Type']=“Equal”
不会只返回一个值。它正在返回多个值。将条件传递给
if
语句时,需要确保该条件将导致单个
True
False

x['Type']==“Equal”
语句返回
True
False
的集合(
pd.Series
)。因此,错误消息基本上是告诉您尝试使用它在错误消息中提到的任何一个函数,使其成为单个
True
/
False

您必须更改您的条件以符合python函数。
此外,还有其他方法来完成您试图执行的操作

这里的问题是
x['Type']==“Equal”
不会只返回一个值。它正在返回多个值。将条件传递给
if
语句时,需要确保该条件将导致单个
True
False

x['Type']==“Equal”
语句返回
True
False
的集合(
pd.Series
)。因此,错误消息基本上是告诉您尝试使用它在错误消息中提到的任何一个函数,使其成为单个
True
/
False

您必须更改您的条件以符合python函数。
此外,如果我正确理解了您的问题,还有其他方法可以完成您想要做的事情,我相信这就是您要寻找的。您可以按
类型
列对数据帧进行子集划分,得到总和,然后将其除以总和。这就是我认为您正试图使用
if
语句所做的

使用示例中给出的数据:

import pandas as pd

df = [[39484, 'Chennai', 2, 2, 'Chennai', 'Equal'],
      [5957, 'Hyderabad', 1, 1, 'Chennai', 'Not Equal'],
      [22932, 'Burhanput', 1, 1, 'Vadodara', 'Not Equal'],
      [176584, 'Hyderabad', 1, 1, 'Vadodara', 'Not Equal'],
      [2781, 'Mumbai', 1, 1, 'Vadodara', 'Not Equal'],
     ]
cols = ['dir_query_mcatid', 'buyer_city', 'count(z.generate_buylead)',
        'count(z.purchase_buylead)', 'seller_city', 'type']

test = pd.DataFrame(df, columns=cols)
def calc(x):
    sum_equal = x[x['type'] == 'Equal']['count(z.generate_buylead)'].sum()
    final_percent = (sum_equal*100)/x['count(z.generate_buylead)'].sum()
    return final_percent

new = test.groupby(['dir_query_mcatid','buyer_city']).apply(lambda x: calc(x)).reset_index().rename(columns={0:'percent'})
test = test.merge(new, on=['dir_query_mcatid', 'buyer_city'])
print(test)
这将产生以下输出:

  dir_query_mcatid buyer_city  count(z.generate_buylead)  \
0             39484    Chennai                          2   
1              5957  Hyderabad                          1   
2             22932  Burhanput                          1   
3            176584  Hyderabad                          1   
4              2781     Mumbai                          1   

   count(z.purchase_buylead) seller_city       type  percent  
0                          2     Chennai      Equal    100.0  
1                          1     Chennai  Not Equal      0.0  
2                          1    Vadodara  Not Equal      0.0  
3                          1    Vadodara  Not Equal      0.0  
4                          1    Vadodara  Not Equal      0.0  

如果我对你的问题理解正确,我相信这就是你要找的。您可以按
类型
列对数据帧进行子集划分,得到总和,然后将其除以总和。这就是我认为您正试图使用
if
语句所做的

使用示例中给出的数据:

import pandas as pd

df = [[39484, 'Chennai', 2, 2, 'Chennai', 'Equal'],
      [5957, 'Hyderabad', 1, 1, 'Chennai', 'Not Equal'],
      [22932, 'Burhanput', 1, 1, 'Vadodara', 'Not Equal'],
      [176584, 'Hyderabad', 1, 1, 'Vadodara', 'Not Equal'],
      [2781, 'Mumbai', 1, 1, 'Vadodara', 'Not Equal'],
     ]
cols = ['dir_query_mcatid', 'buyer_city', 'count(z.generate_buylead)',
        'count(z.purchase_buylead)', 'seller_city', 'type']

test = pd.DataFrame(df, columns=cols)
def calc(x):
    sum_equal = x[x['type'] == 'Equal']['count(z.generate_buylead)'].sum()
    final_percent = (sum_equal*100)/x['count(z.generate_buylead)'].sum()
    return final_percent

new = test.groupby(['dir_query_mcatid','buyer_city']).apply(lambda x: calc(x)).reset_index().rename(columns={0:'percent'})
test = test.merge(new, on=['dir_query_mcatid', 'buyer_city'])
print(test)
这将产生以下输出:

  dir_query_mcatid buyer_city  count(z.generate_buylead)  \
0             39484    Chennai                          2   
1              5957  Hyderabad                          1   
2             22932  Burhanput                          1   
3            176584  Hyderabad                          1   
4              2781     Mumbai                          1   

   count(z.purchase_buylead) seller_city       type  percent  
0                          2     Chennai      Equal    100.0  
1                          1     Chennai  Not Equal      0.0  
2                          1    Vadodara  Not Equal      0.0  
3                          1    Vadodara  Not Equal      0.0  
4                          1    Vadodara  Not Equal      0.0  

谢谢是的,这就是我要找的。但是在运行上面的代码时,我得到了一个错误:“ValueError:Buffer-dtype不匹配,预期为‘Python-object’,但得到了‘long-long’”,以及“TypeError:inserted列的索引与框架索引不兼容”@J.Doe我已经更新了代码以提供更健壮的answer@J.Doe如果这解决了你的问题,你能接受答案吗谢谢!是的,这就是我要找的。但是在运行上面的代码时,我得到一个错误:“ValueError:Buffer-dtype不匹配,预期为‘Python-object’,但得到了‘long-long’”,以及“TypeError:inserted-column的索引与frame-index不兼容”@J.Doe我已经更新了代码,以提供更健壮的性能answer@J.Doe如果这解决了你的问题,你能接受答案吗?谢谢。