簡體   English   中英

基於出現次數的熊貓新數據框

[英]pandas new dataframe based on number of occurences

我想創建一個僅包含出現次數最多的行的新數據框:

我的代碼如下:

import pandas as pd

f1=pd.read_csv('FILE1.csv')
f2=pd.read_csv('FILE2.csv')
df_all = f2.merge(f1, how='left', on='Symbol')
df_sort = df_all.sort_values(by=['Symbol','Date'], ascending=[True,True])
df_sort=df_sort.dropna()
df_cnt=df_sort['Symbol'].value_counts()

來自2個文件的原始數據合並到df_all中:

In[1]: f1

Out[2]: 
  Symbol  Weight
0    IBM     0.2
1     GE     0.3
2   AAPL     0.4
3    XOM     0.1

In[2]: f2

Out[3]: 
        Date Symbol  ClosingPrice
0   3/1/2010    IBM        116.51
1   3/2/2010    IBM        117.32
2   3/3/2010    IBM        116.40
3   3/4/2010    IBM        116.58
4   3/5/2010    IBM        117.61
5   3/1/2010     GE         45.00
6   3/2/2010     GE         43.50
7   3/3/2010     GE         46.00
8   3/1/2010   AAPL         85.07
9   3/2/2010   AAPL         85.10
10  3/3/2010   AAPL         86.20
11  3/4/2010   AAPL         84.93
12  3/5/2010   AAPL         84.80
13  3/1/2010    XOM         98.15
14  3/2/2010    XOM         99.00
15  3/3/2010    XOM         98.23
16  3/4/2010    XOM         97.56
17  3/1/2010   MSFT         99.00
18  3/2/2010   MSFT         98.00
19  3/3/2010   MSFT         97.00
20  3/4/2010   MSFT         98.00
21  3/5/2010   MSFT         97.00

In[4]:df_all

Out[4]: 
      Date     Symbol  ClosingPrice  Weight
0   3/1/2010    IBM        116.51     0.2
1   3/2/2010    IBM        117.32     0.2
2   3/3/2010    IBM        116.40     0.2
3   3/4/2010    IBM        116.58     0.2
4   3/5/2010    IBM        117.61     0.2
5   3/1/2010     GE         45.00     0.3
6   3/2/2010     GE         43.50     0.3
7   3/3/2010     GE         46.00     0.3
8   3/1/2010   AAPL         85.07     0.4
9   3/2/2010   AAPL         85.10     0.4
10  3/3/2010   AAPL         86.20     0.4
11  3/4/2010   AAPL         84.93     0.4
12  3/5/2010   AAPL         84.80     0.4
13  3/1/2010    XOM         98.15     0.1
14  3/2/2010    XOM         99.00     0.1
15  3/3/2010    XOM         98.23     0.1
16  3/4/2010    XOM         97.56     0.1
17  3/1/2010   MSFT         99.00     NaN
18  3/2/2010   MSFT         98.00     NaN
19  3/3/2010   MSFT         97.00     NaN
20  3/4/2010   MSFT         98.00     NaN
21  3/5/2010   MSFT         97.00     NaN

然后,我對除去NaN值的數據進行排序:

In[5]: df_sort

Out[5]: 
        Date Symbol  ClosingPrice  Weight
8   3/1/2010   AAPL         85.07     0.4
9   3/2/2010   AAPL         85.10     0.4
10  3/3/2010   AAPL         86.20     0.4
11  3/4/2010   AAPL         84.93     0.4
12  3/5/2010   AAPL         84.80     0.4
5   3/1/2010     GE         45.00     0.3
6   3/2/2010     GE         43.50     0.3
7   3/3/2010     GE         46.00     0.3
0   3/1/2010    IBM        116.51     0.2
1   3/2/2010    IBM        117.32     0.2
2   3/3/2010    IBM        116.40     0.2
3   3/4/2010    IBM        116.58     0.2
4   3/5/2010    IBM        117.61     0.2
13  3/1/2010    XOM         98.15     0.1
14  3/2/2010    XOM         99.00     0.1
15  3/3/2010    XOM         98.23     0.1
16  3/4/2010    XOM         97.56     0.1

然后,我確定每個符號的出現總數

In[6]: df_cnt

Out[6]: 
AAPL    5
IBM     5
XOM     4
GE      3
Name: Symbol, dtype: int64

在這一點上,我對如何創建一個新的數據幀df_final表示困惑,它僅包含出現次數為最大次數的數據。 在這種情況下5。

我的最終數據框應如下所示:

     Date    Symbol  ClosingPrice  Weight
   3/1/2010   AAPL         85.07     0.4
   3/2/2010   AAPL         85.10     0.4
   3/3/2010   AAPL         86.20     0.4
   3/4/2010   AAPL         84.93     0.4
   3/5/2010   AAPL         84.80     0.4
   3/1/2010    IBM        116.51     0.2
   3/2/2010    IBM        117.32     0.2
   3/3/2010    IBM        116.40     0.2
   3/4/2010    IBM        116.58     0.2
   3/5/2010    IBM        117.61     0.2

你可以找出Symbol與最大群規模df_cnt從和過濾行df_sort

df_sort[df_sort.Symbol.isin(df_cnt.index[df_cnt == df_cnt.max()])]

#       Date    Symbol  ClosingPrice Weight
# 8 3/1/2010      AAPL         85.07    0.4
# 9 3/2/2010      AAPL         85.10    0.4
#10 3/3/2010      AAPL         86.20    0.4
#11 3/4/2010      AAPL         84.93    0.4
#12 3/5/2010      AAPL         84.80    0.4
# 0 3/1/2010       IBM        116.51    0.2
# 1 3/2/2010       IBM        117.32    0.2
# 2 3/3/2010       IBM        116.40    0.2
# 3 3/4/2010       IBM        116.58    0.2
# 4 3/5/2010       IBM        117.61    0.2

你可以試試

 df_sort[df_sort.Symbol.isin(df_cnt[df_cnt >= df_cnt.max()].index)]
  • df_cnt.max()是的最大值df_cnt

  • df_cnt[df_cnt >= df_cnt.max()].index是計數至少為最大值的所有項目的索引。

  • 現在,僅檢查結果中“ Symbol列中的哪些條目。

您可以為此目的使用map

df_sort[df_sort['Symbol'].map(df_cnt==df_cnt.max())]

        Date Symbol  ClosingPrice  Weight
8   3/1/2010   AAPL         85.07     0.4
9   3/2/2010   AAPL         85.10     0.4
10  3/3/2010   AAPL         86.20     0.4
11  3/4/2010   AAPL         84.93     0.4
12  3/5/2010   AAPL         84.80     0.4
0   3/1/2010    IBM        116.51     0.2
1   3/2/2010    IBM        117.32     0.2
2   3/3/2010    IBM        116.40     0.2
3   3/4/2010    IBM        116.58     0.2
4   3/5/2010    IBM        117.61     0.2

暫無
暫無

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

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