繁体   English   中英

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

[英]How to pull the first instance when a column satisfies a certain condition in pandas?

我正在尝试将第一个实例中的帐户余额等于或低于 0。在下面的示例中,我想创建一个列,其中只有 X 和 Y 从正数移动到低于或等于 0 的行,即 X将是第 4 行中的 2017-1-4,而 Y 将是第 8 行中的 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,NaT,NaT,1483488000000000000,NaT,NaT,NaT,1517616000000000000],dtype = 对象)

我该如何解决这个问题? Python 和 Pandas 仍然很新,所以可能很明显!

一种可能的解决方案是使用 df.values,它将 dataframe 作为 numpy 数组 object 返回。 然后,您可以使用 for 循环的组合来遍历 dataframe 的每一行并检查 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[0]、each[1] 和 each[2] 到 select 帐户、余额和日期,并检查它们是否是您要查找的内容。

您可以将 boolean 掩码直接应用于 dataframe,如下所示: x = df.groupby('Account')['Balance'].apply(lambda x: (x<=0) & (0<x.shift()))

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM