[英]Lookup values in pandas dataframe
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
假設數據按日期排序。 如何精確計算每個日期的第一行。 如果 'Volume' 為 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 行(連續)。 我應該使用范圍函數嗎?
使用帶有掩碼的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
替代DataFrame.query
:
df = df.query('Volume != 0').drop_duplicates('Date')
編輯:
對於提取第二/第三/下一列使用GroupBy.nth
,只有 python 從0
計數,因此對於第二行需要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
使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.