簡體   English   中英

根據日期熊貓高效創建行

[英]Efficiently create row based on date pandas

目前我有一系列我正在創建的列包含一個基於我正在使用的Dataframe中的日期的布爾值

df['bool1'] = [1 if x > pd.to_datetime('20190731') else 0 for x in df['date']]

df['bool2'] = [1 if x > pd.to_datetime('20190803') else 0 for x in df['date']]

df['bool3'] = [1 if x > pd.to_datetime('20190813') else 0 for x in df['date']]

我認為像這樣的列表理解是解決問題的pythonic方法。 我覺得我的代碼非常清楚它在做什么,有人可以輕松地遵循它。

在為{bool1:'20190731'}創建字典時,可能會有一個改進,然后循環鍵:值對,這樣我就不會重復代碼行了。 但這只會減少行數,同時提高可讀性和可擴展性。 它實際上不會使我的代碼運行得更快。

但是我的問題是這段代碼實際上運行起來很慢。 我應該使用lambda函數來加速嗎? 編寫此代碼的最快方法是什么?

我認為具有比較值的新列的字典是個好主意。

d = {'bool1':'20190731', 'bool2':'20190803', 'bool3':'20190813'}

然后可以在循環中創建新列:

for k, v in d.items():
    df[k] = (df['date'] > pd.to_datetime(v)).astype(int)
    #alternative
    #df[k] = np.where(df['date'] > pd.to_datetime(v), 1, 0)

為了提高性能,請使用numpy中的廣播:

rng = pd.date_range('20190731', periods=20)
df = pd.DataFrame({'date': rng})  

d = {'bool1':'20190731', 'bool2':'20190803', 'bool3':'20190813'}

#pandas 0.24+
mask = df['date'].to_numpy()[:, None] > pd.to_datetime(list(d.values())).to_numpy()
#pandas below
#mask = df['date'].values[:, None] > pd.to_datetime(list(d.values())).values
arr = np.where(mask, 1, 0)

df = df.join(pd.DataFrame(arr, columns=d.keys()))
print (df)
         date  bool1  bool2  bool3
0  2019-07-31      0      0      0
1  2019-08-01      1      0      0
2  2019-08-02      1      0      0
3  2019-08-03      1      0      0
4  2019-08-04      1      1      0
5  2019-08-05      1      1      0
6  2019-08-06      1      1      0
7  2019-08-07      1      1      0
8  2019-08-08      1      1      0
9  2019-08-09      1      1      0
10 2019-08-10      1      1      0
11 2019-08-11      1      1      0
12 2019-08-12      1      1      0
13 2019-08-13      1      1      0
14 2019-08-14      1      1      1
15 2019-08-15      1      1      1
16 2019-08-16      1      1      1
17 2019-08-17      1      1      1
18 2019-08-18      1      1      1
19 2019-08-19      1      1      1

numpy.where它應該更快


df['bool1'] = np.where(df['date'] > pd.to_datetime('20190731'), 1, 0)
df['bool2'] = np.where(df['date'] > pd.to_datetime('20190803'), 1, 0)
df['bool3'] = np.where(df['date'] > pd.to_datetime('20190813'), 1, 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM