簡體   English   中英

Pandas-如何獲取另一列中每個對應值的行數

[英]Pandas- How to get number of times row occurs for each corresponding value in another column

我有一個非常復雜的問題,我需要幫助搞清楚。

首先,我有一個數據幀:

 one       two     three     four      Date
comedy      a       asad      123      2013-01-18 10:00:00  
romantic    b       fas       563      2015-01-28 12:00:00
comedy      c       ewf       134      2014-01-22 09:00:00
action      a       qef       561      2013-02-18 18:00:00
action      z       adwq      1323     2016-01-23 16:00:00
...

我試圖找到計算數據列中每周的“一”列中每個唯一值的出現次數(頻率)的最佳方法。 然后,我希望能夠以某種方式比較每周中每次出現的頻率是否更高,導致列'4'的數字更高或更低。

我想要的輸出是這樣的,但我願意接受更好的解決方案:

 ones       2013-01-00  2013-01-07  2013-01-14.....    Total_frequency
 comedy         4          5           6                15
 romantic       1          2           0                3 
 action         0          0           0                0 
 ....

列'one'中的每個唯一值都在'ones'下,並且每周的總出現次數在每周列之下。 (周列將在指定的一周開始(例如,在上述情況下 - > 2013-01-00)。

雖然,我在嘗試考慮將整個頻率與數據幀中的第4列相關聯的最佳方法時遇到了麻煩。

如果有人知道我可以做到這一點的最佳方式,我們將非常感激。

如果您需要更多信息,請告訴我。

編輯:

  ones       2013-01-00  2013-01-07  2013-01-14.....    Total_frequency
 comedy         4          5           6                15
 romantic       1          2           0                3 
 action       NaN          1           0                1 

謝謝。

采用:

#changed data sample for better verify output
print (df)
        one two three  four                 Date
0    comedy   a  asad   123  2013-01-18 10:00:00
1  romantic   b   fas   563  2013-01-28 12:00:00
2    comedy   c   ewf   134  2013-01-22 09:00:00
3    action   a   qef   561  2013-02-18 18:00:00
4    action   z  adwq  1323  2013-01-23 16:00:00

使用GrouperDataFrameGroupBy.sizeunstack

df['Date'] = pd.to_datetime(df['Date'])
df = (df.groupby(['one',pd.Grouper(freq='W-MON', key='Date')])
        .size()
        .unstack(fill_value=0)
        .sort_index(axis=1))

df.columns = df.columns.date
df['Total_frequency'] = df.sum(axis=1)
print (df)
          2013-01-21  2013-01-28  2013-02-18  Total_frequency
one                                                          
action             0           1           1                2
comedy             1           1           0                2
romantic           0           1           0                1

編輯:在第一個NaN之后為值創建布爾掩碼,並僅通過此掩碼替換缺失值:

print (df)
          2013-01-00  2013-01-07  2013-01-14
ones                                        
comedy           4.0           5         6.0
romantic         1.0           2         NaN
action           NaN           1         NaN

mask = df.notnull().cumsum(axis=1).ne(0)
#another solution
#mask = df.ffill(axis=1).notnull()

df = df.mask(mask, df.fillna(0))
print (df)
          2013-01-00  2013-01-07  2013-01-14
ones                                        
comedy           4.0           5         6.0
romantic         1.0           2         0.0
action           NaN           1         0.0

你可以試試這個:

df = pd.DataFrame({'one': [random.choice(['comedy', 'action', 'romantic']) for i in range(1000)],
                  'Date': pd.date_range(start = '2013-01-01', periods = 1000)})
df.head()

      one        Date
0   romantic    2013-01-01
1   romantic    2013-01-02
2   romantic    2013-01-03
3   action       2013-01-04
4   romantic    2013-01-05

df.groupby([pd.Grouper(key = 'Date', freq = 'W'), 'one'])['one'].count().unstack(level = 0)

Date          2013-01-06  2013-01-13  2013-01-20.....
one           
comedy         2         2           2              
romantic       NaN       2           2               
action         4         3           3    

暫無
暫無

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

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