我正在尝试拉取第一个实例,帐户余额等于或下降到0以下。在下面的示例中,我想创建一个列,其中只有X和Y从正数移动到小于或等于0的行,即在第4行中X将是2017-1-4,在第8行中Y将是2018-2-3。
df= pd.DataFrame()
df['Account'] = ['X','X','X','X','X','Y','Y','Y']
df['Balance'] = [100,90,80,0,0,900,90,-1]
df['Date'] = [pd.to_datetime('2017-1-1'),pd.to_datetime('2017-1-2'),pd.to_datetime('2017-1-3'),pd.to_datetime('2017-1-4'),pd.to_datetime('2017-1-5'),pd.to_datetime('2018-2-1'),pd.to_datetime('2018-2-2'),pd.to_datetime('2018-2-3')]
print(df)
谢谢!
编辑:我想我想要的答案可能是这样的
x = df.groupby('Account')['Balance']\
.apply(lambda x: (x<=0) & (0<x.shift()))
这将在余额变为0或更小时返回实例,并与之前的实例进行比较。但是,当我尝试获取日期信息时,它会给我一个我无法获取的数字:
y = np.where(x,df['Date'],pd.NaT)
数组( NaT,1483488000000000000,NaT,1517616000000000000,dtype=object)
我该如何解决这个问题?对于Python和Pandas来说,这仍然是非常新的,所以这可能是非常明显的事情!
发布于 2021-02-10 13:45:21
您可以将布尔掩码直接应用于数据帧,如下所示:x = df.groupby('Account')['Balance'].apply(lambda x: (x<=0) & (0<x.shift()))
df[x]
或df[x]['column_name_that_you_need']
发布于 2021-02-10 10:33:03
一种可能的解决方案是使用df.values,它将数据帧作为numpy数组对象返回。然后,您可以使用for循环的组合来迭代数据帧的每一行,并检查account == X或Y和Balance <= 0,如果是,则返回日期:
def zero_bal(a, df=df):
for each in df.values:
if each[0] == a and each[1] <= 0:
return each[2]
X, Y = zero_bal('X'), zero_bal('Y')
在上面的代码中,"for each In df.values:“中的"each”类似于:
'X',80,时间戳(‘2017-01-03 00:00:00')
然后,您可以使用索引each、each1和each2分别选择帐户、余额和日期,并检查它们是否是您要查找的内容。
https://stackoverflow.com/questions/66134615
复制相似问题