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行。我应该使用范围功能吗?
答案 0 :(得分:3)
使用boolean indexing
和Series.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
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