熊猫数据框中的查找值

时间:2020-02-19 13:47:06

标签: python pandas dataframe lambda

Date        Ticker    Volume
2019-03-21    AAPL        10
2019-03-21    GOOG         5
2019-03-21     IBM         0
2019-03-25    AAPL         0
2019-03-25     IBM         0
2019-03-25    GOOG        12
2019-03-27    AAPL         0
2019-03-27     IBM        16
2019-03-27    GOOG        10
2019-03-28     IBM         9
2019-03-28    GOOG         0
2019-03-28    AAPL        10

假设数据按日期排序。如何精确计算每个日期的第一行。如果“音量”为0,则进行下一行直到不为0。

Date        Ticker    volume
2019-03-21    AAPL        10
2019-03-25    GOOG        12
2019-03-27     IBM        16
2019-03-28     IBM         9

我尝试使用lambda,但似乎无法正常工作。

df_new = df.groupby(['Date']).head(lambda x: 2 if df['Volume'] == 0 else 1).reset_index(0, drop=True)

TypeError: unorderable types: int() < function()

如果我有足够的数据,并且希望从每个日期开始精确(连续)排2-5行。我应该使用范围功能吗?

2 个答案:

答案 0 :(得分:3)

使用boolean indexingSeries.ne加上掩码,然后不等于DataFrame.drop_duplicates

df = df[df['Volume'].ne(0)].drop_duplicates('Date')
print (df)
         Date Ticker  Volume
0  2019-03-21   AAPL      10
5  2019-03-25   GOOG      12
7  2019-03-27    IBM      16
9  2019-03-28    IBM       9

替代DataFrame.query

df = df.query('Volume != 0').drop_duplicates('Date')

编辑:

要提取第二/第三/下一列,请使用GroupBy.nth,只有来自0的python计数,因此第二行需要1,第三行需要2

df1 = df[df['Volume'].ne(0)]
print (df1)
          Date Ticker  Volume
0   2019-03-21   AAPL      10
1   2019-03-21   GOOG       5
5   2019-03-25   GOOG      12
7   2019-03-27    IBM      16
8   2019-03-27   GOOG      10
9   2019-03-28    IBM       9
11  2019-03-28   AAPL      10

df2 = df1.groupby('Date').nth(1)
print (df2)
           Ticker  Volume
Date                     
2019-03-21   GOOG       5
2019-03-27   GOOG      10
2019-03-28   AAPL      10

或使用GroupBy.cumcount遮罩:

df2 = df1[df1.groupby('Date').cumcount().eq(1)]
print (df2)
          Date Ticker  Volume
1   2019-03-21   GOOG       5
8   2019-03-27   GOOG      10
11  2019-03-28   AAPL      10

答案 1 :(得分:1)

使用drop_duplicates

df1=df.loc[df.Volume!=0].drop_duplicates('Date')
Out[13]: 
         Date Ticker  Volume
0  2019-03-21   AAPL      10
5  2019-03-25   GOOG      12
7  2019-03-27    IBM      16
9  2019-03-28    IBM       9