【问题标题】:Pandas-Dataframe: how to count the number of times a variable is repeated in 1 minutePandas-Dataframe:如何计算变量在 1 分钟内重复的次数
【发布时间】:2019-08-01 18:49:48
【问题描述】:

我有以下数据框 sn-p:

Full dataframe:                   ip      time      cik  crawler
ts                                                              
2019-03-11 00:00:01   71.155.177.ide  00:00:01  1262327      0.0
2019-03-11 00:00:02   71.155.177.ide  00:00:02  1262329      0.0
2019-03-11 00:00:05   69.243.218.cah  00:00:05   751200      0.0
2019-03-11 00:00:08  172.173.121.efb  00:00:08   881890      0.0
2019-03-11 00:00:09   216.254.60.idd  00:00:09  1219169      0.0
2019-03-11 00:00:09    64.18.197.gjc  00:00:09  1261705      0.0
2019-03-11 00:00:09    64.18.197.gjc  00:00:09  1261734      0.0
2019-03-11 00:00:10    64.18.197.gjc  00:00:10  1263094      0.0
2019-03-11 00:00:10    64.18.197.gjc  00:00:10  1264242      0.0
2019-03-11 00:00:10    64.18.197.gjc  00:00:10  1264242      0.0

我想按 IP 分组,然后使用一些函数来计数:

1) 1 分钟内每个 IP 有多少个唯一 CIK

2) 1 分钟内每个 IP 有多少个 CIK(总共)。

我已经尝试过 resample 功能,但我不知道如何让它以我想要的方式计数。 我的代码如下:

dataframe = pd.read_csv(path + "log20060702.csv", usecols=['cik', 'ip', 'time', 'crawler'])
dataframe = dataframe[dataframe['crawler'] == 0]
dataframe['cik'] = pd.to_numeric(dataframe['cik'], downcast='integer')
dataframe['ts'] = pd.to_datetime((dataframe['time']))

dataframe = dataframe.set_index(['ts'])
print("Full dataframe: ", dataframe.head(10))

df_dict = dataframe.groupby("ip")
counter = 0
for key, df_values in df_dict:
    counter += 1
    print("df values: ", df_values)
    # df_values = df_values.resample("5T").count()
    if counter == 5:
        break

或者,如果有人可以告诉我如何按 IP 分组,每 1 分钟一次,其余的我可以自己完成。我不一定要寻找完整的解决方案,非常感谢一些指导。

【问题讨论】:

    标签: python-3.x pandas datetime dataframe pandas-groupby


    【解决方案1】:

    使用groupbyDataFrameGroupBy.resample 并聚合SeriesGroupBy.nuniqueDataFrameGroupBy.size 计数:

    df = dataframe.groupby("ip").resample('1Min')['cik'].agg(['nunique','size'])
    print (df)
                                nunique  size
    ip              ts                       
    172.173.121.efb 2019-03-11        1     1
    216.254.60.idd  2019-03-11        1     1
    64.18.197.gjc   2019-03-11        4     5
    69.243.218.cah  2019-03-11        1     1
    71.155.177.ide  2019-03-11        2     2
    

    或者使用Grouper:

    df = dataframe.groupby(["ip", pd.Grouper(freq='1Min')])['cik'].agg(['nunique','size'])
    print (df)
                                nunique  size
    ip              ts                       
    172.173.121.efb 2019-03-11        1     1
    216.254.60.idd  2019-03-11        1     1
    64.18.197.gjc   2019-03-11        4     5
    69.243.218.cah  2019-03-11        1     1
    71.155.177.ide  2019-03-11        2     2
    

    【讨论】:

    • 在这种情况下,.resample('1Min') 是否每分钟返回 size
    • @Erfan - 是的,没错。
    • 非常简洁,在这种情况下您不必明确提及datetime 列。如果有多个日期时间列,那将如何工作? @jezrael
    • @Erfan - 需要一个,最好的melt
    猜你喜欢
    • 2017-11-20
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    相关资源
    最近更新 更多