gpt4 book ai didi

python - 根据条件对 Pandas 数据框进行分组?

转载 作者:行者123 更新时间:2023-11-28 22:15:10 25 4
gpt4 key购买 nike

我正在按照这里的建议 pandas create new column based on values from other columns但仍然出错。基本上,我的 Pandas 数据框有很多列,我想根据一个新的分类列对数据框进行分组,该列的值取决于两个现有列(AMP、时间)。

df
df['Time'] = pd.to_datetime(df['Time'])
#making sure Time column read from the csv file is time object

import datetime as dt
day_1 = dt.date.today()
day_2 = dt.date.today() - dt.timedelta(days = 1)

def f(row):

if (row['AMP'] > 100) & (row['Time'] > day_1):
val = 'new_positives'

elif (row['AMP'] > 100) & (day_2 <= row['Time'] <= day_1):
val = 'rec_positives'

elif (row['AMP'] > 100 & row['Time'] < day_2):
val = 'old_positives'

else:
val = 'old_negatives'

return val

df['GRP'] = df.apply(f, axis=1) #this gives the following error:
TypeError: ("Cannot compare type 'Timestamp' with type 'date'", 'occurred at index 0')

df[(df['AMP'] > 100) & (df['Time'] > day_1)] #this works fine

df[(df['AMP'] > 100) & (day_2 <= df['Time'] <= day_1)] #this works fine

df[(df['AMP'] > 100) & (df['Time'] < day_2)] #this works fine


#df = df.groupby('GRP')

我能够根据上面指定的条件选择合适的子数据帧,但是当我在每一行上应用上面的函数时,我得到了错误。根据列出的条件对数据框进行分组的正确方法是什么?

编辑:

不幸的是,我无法提供我的数据框示例。但是,这是一个简单的数据框,它给出了相同类型的错误:

import numpy as np
import pandas as pd
mydf = pd.DataFrame({'a':np.arange(10),
'b':np.random.rand(10)})

def f1(row):
if row['a'] < 5 & row['b'] < 0.5:
value = 'less'
elif row['a'] < 5 & row['b'] > 0.5:
value = 'more'
else:
value = 'same'
return value

mydf['GRP'] = mydf.apply(f1, axis=1)

ypeError: ("unsupported operand type(s) for &: 'int' and 'float'", 'occurred at index 0')

编辑 2:正如下面所建议的,用圆括号括起比较运算符可以解决伪造示例的问题。这个问题就解决了。

但是,在我的真实示例中,我仍然遇到同样的错误。顺便说一下,如果我将“AMP”列与表中的另一列一起使用,那么一切正常,我可以通过将函数 f 应用于每一行来创建 df['GRP']。这表明问题与使用 df['Time'] 有关。但是为什么我可以选择 df[(df['AMP'] > 100) & (df['Time'] > day_1)]?为什么这会在这种情况下起作用,但当条件出现在函数中时却不起作用?

最佳答案

根据您的错误消息和示例,有两件事需要解决。一种是在您的最终 elif 中调整运算符优先级的括号陈述。另一种是避免混用datetime.dateTimestamp对象。

修复 1: 更改:

elif (row['AMP'] > 100 & row['Time'] < day_2):

为此:

elif (row['AMP'] > 100) & (row['Time'] < day_2):

这两行是不同的,因为按位 &运算符优先于 <>比较运算符,因此 python 尝试评估 100 & row['Time'] . Python 运算符优先级的完整列表在这里:https://docs.python.org/3/reference/expressions.html#operator-precedence

修复 2: 更改这 3 行:

import datetime as dt
day_1 = dt.date.today()
day_2 = dt.date.today() - dt.timedelta(days = 1)

这两行:

day1 = pd.to_datetime('today')
day_2 = day_1 - pd.DateOffset(days=1)

关于python - 根据条件对 Pandas 数据框进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52959190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com