当一个列在pandas中满足某个条件时,如何拉出第一个实例?



我试图拉第一个实例帐户余额等于或低于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)

array([NaT, NaT, NaT, 1483488000000000000, NaT, NaT, NaT,]1517616000000000000), dtype =对象)

如何解决这个问题?对Python和Pandas仍然很陌生,所以可能有些东西很明显!

你可以直接对你的数据框架应用布尔掩码,如下所示:x = df.groupby('Account')['Balance'].apply(lambda x: (x<=0) & (0<x.shift()))

df[x]df[x]['column_name_that_you_need']

一个可能的解决方案是使用df。值,它将数据帧作为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')

在上面的代码中,"each"在"for each In df.values:"应该是这样的:

(80年"X",时间戳(2017-01-03就是)]

然后您可以使用索引each[0], each[1]和each[2]分别选择帐户,余额和日期,并检查它们是否是您正在寻找的。

最新更新