Python Pandas-如何获取另一列中每个对应值的行发生次数

Python Pandas-如何获取另一列中每个对应值的行发生次数,python,pandas,datetime,Python,Pandas,Datetime,我有一个相当复杂的问题需要帮助解决 首先,我有一个数据帧: 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:

我有一个相当复杂的问题需要帮助解决

首先,我有一个数据帧:

 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 
 ....
“一”列中的每个唯一值位于“一”列下,其每周出现的总次数位于“每周”列下。(周列将从指定周开始(例如,在上述情况下->2013-01-00)

尽管如此,我还是很难在数据帧中找到将总频率与第四列相关联的最佳方法

如果有人知道我能做这件事的最佳方法,我将不胜感激

如果你需要更多的信息,请告诉我

编辑:

谢谢。

使用:

#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
与和一起使用:

编辑:为第一个
NaN
s之后的值创建布尔掩码,并仅用此掩码替换缺少的值:

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    

那么
df.groupby('one')['Date'].nunique()
呢,或者如果只是对
one列的值进行计数,那么
df.one.value\u计数()
请提供所需的输出,如果您尝试了一些东西,请将其也放在帖子中!@momojoh1所需的输出来自所提供的样本数据集?如果是,请解释您获得的计数逻辑,我无法理解为什么喜剧计数以4开始。@momojoh1发生了什么?在您的da中ta或发布的数据?如果不是更晚的话,你能编辑预期的输出吗?现在没有任何意义
Date
列必须有不同的日期时间和年份,而不仅仅是2013年!@pygo-是的,我更改样本以便于验证解决方案,不幸的是,OP样本数据不可能。好吧,这听起来很简单。@momojoh1-如果更改
.unstack(fill_value=0)
.unstack()
然后得到
NaN
s而不是
0
,因此如果使用
df.mean(axis=1)
它只计算非NaNs值的平均值。@momomojoh1因此将
pd.gropper(freq='W-MON',key='Date')
更改为
df['Date'].dt.time
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