【问题标题】:count values in one pandas series based on date column and other column根据日期列和其他列计算一个熊猫系列中的值
【发布时间】:2018-03-24 10:57:54
【问题描述】:

我有几列数据,它们位于 pandas 数据框中。数据看起来像

           cus_id   timestamp       values    second_val
0          10173    2010-06-12        39.0      1
1          95062    2010-09-11        35.0      2 
2          171081   2010-07-05        39.0      1 
3          122867   2010-08-18        39.0      1
4          107186   2010-11-23        0.0       3
5          171085   2010-09-02        0.0       2
6          169767   2010-07-03        28.0      2
7          80170    2010-03-23        39.0      2
8          154178   2010-10-02        37.0      2
9          3494     2010-11-01        0.0       1
.
.
.
.
5054054    1716139  2012-01-12        0.0     2
5054055    1716347  2012-01-18        28.0    1
5054056    1807501  2012-01-21        0.0     1

有 0 个值数据出现在值列中,并且出现在不同的日期。当当时的值列数据等于零时,我尝试对每个月的所有 second_val 值进行分组以正确绘制它们,我使用

Jan10 = df.second_val[df['timestamp'].str.contains('2010-01')][df['values']==0].sum()
Feb10 = df.second_val[df['timestamp'].str.contains('2010-02')][df['values']==0].sum()
Mar10 = df.second_val[df['timestamp'].str.contains('2010-03')][df['values']==0].sum()
.
. 
.
. 
Jan12 = df.second_val[df['timestamp'].str.contains('2012-01')][df['values']==0].sum()
Feb12 = df.second_val[df['timestamp'].str.contains('2012-02')][df['values']==0].sum()


Months = ['2010-01', '2010-02', '2010-03', '2010-04' . . . . ., '2012-01', '2012-02']
Months_Orders = [Jan10, Feb10, Mar10, Apr10, . . . . ..  ., Jan12, Feb12]

plt.figure(figsize=(15,8))
plt.scatter(x = Months, y = Months_Orders)

如果 0 在 jan10 出现 10 天并且 second_val 数据的总和为 20。那么它应该给我 20 的 1 月份 例如

  cus_id   timestamp       values    second_val
    0          10173    2010-01-10        0.0      1
    .
    .
    13          95062    2010-01-11        0.0      2 
    34          171081   2010-01-23        0.0      1 

有没有办法通过编写函数或任何内置的 pandas 方式来改进。我尝试了我以前的问题解决方案,但它有所不同并且对我来说不能正常工作,所以我使用这个硬编码,它似乎效率低下。谢谢

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    IIUC

    df.timestamp=pd.to_datetime(df.timestamp)
    df=df[df['values']==0]# filter it before groupby 
    df.groupby(df.timestamp.dt.strftime('%Y-%m')).second_val.sum()# using groupby after filter to get what you need, group key is format %Y-%m
    

    【讨论】:

    • 如何绘制散点图或线图。我试图像这样绘制。 df.groupby(df.timestamp.dt.strftime('%Y-%m')).second_val.sum().plot() 。 ......bt x 轴没有数据可显示。 .我的意思是我怎么能把月份放在x轴上。非常感谢, 。您的代码可以很好地计算值。
    • 我试图在 x 轴上绘制月份,但在 x 轴上什么也没有,只是在 x 轴上写了时间戳。
    • 谢谢,我正在尝试这种方式。 bt 因为我有点新,所以我有点挣扎。 df.groupby(df.timestamp.dt.strftime('%Y-%m')).second_val.sum() 。图,ax = plt.subplots() ax.plot(df.date, df) ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) 。我收到这个错误。 . AttributeError: 'str' 对象没有属性 'toordinal'
    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多