পান্ডসের সমষ্টি গণনা পৃথক


95

ধরা যাক আমার কাছে ব্যবহারকারীর ক্রিয়াকলাপের লগ রয়েছে এবং আমি মোট সময়কাল এবং প্রতিদিন অনন্য ব্যবহারকারীর সংখ্যা তৈরি করতে চাই।

import numpy as np
import pandas as pd
df = pd.DataFrame({'date': ['2013-04-01','2013-04-01','2013-04-01','2013-04-02', '2013-04-02'],
    'user_id': ['0001', '0001', '0002', '0002', '0002'],
    'duration': [30, 15, 20, 15, 30]})

সমষ্টি সময়কাল বেশ সহজবোধ্য:

group = df.groupby('date')
agg = group.aggregate({'duration': np.sum})
agg
            duration
date
2013-04-01        65
2013-04-02        45

আমি যা করতে চাই তা হ'ল সময়কাল এবং গণনা একই সাথে আলাদা হয় তবে আমি গণনা_দলের জন্য কোনও সমতুল্য খুঁজে পেতে পারি না:

agg = group.aggregate({ 'duration': np.sum, 'user_id': count_distinct})

এটি কাজ করে, তবে অবশ্যই এর থেকে আরও ভাল উপায় আছে, না?

group = df.groupby('date')
agg = group.aggregate({'duration': np.sum})
agg['uv'] = df.groupby('date').user_id.nunique()
agg
            duration  uv
date
2013-04-01        65   2
2013-04-02        45   1

আমি ভাবছি আমাকে কেবল একটি ক্রিয়াকলাপ সরবরাহ করতে হবে যা সিরিজ অবজেক্টের স্বতন্ত্র আইটেমগুলির গণনা সামগ্রিক ফাংশনে ফিরিয়ে দেয়, তবে আমার কাছে বিভিন্ন লাইব্রেরিতে আমার প্রচুর এক্সপোজার নেই। এছাড়াও, মনে হচ্ছে গোষ্ঠীযুক্ত বস্তুটি ইতিমধ্যে এই তথ্যটি জানে, তাই আমি কী কেবল নকল করার চেষ্টা করব না?

উত্তর:


156

উভয় সম্পর্কে কীভাবে:

>>> df
         date  duration user_id
0  2013-04-01        30    0001
1  2013-04-01        15    0001
2  2013-04-01        20    0002
3  2013-04-02        15    0002
4  2013-04-02        30    0002
>>> df.groupby("date").agg({"duration": np.sum, "user_id": pd.Series.nunique})
            duration  user_id
date                         
2013-04-01        65        2
2013-04-02        45        1
>>> df.groupby("date").agg({"duration": np.sum, "user_id": lambda x: x.nunique()})
            duration  user_id
date                         
2013-04-01        65        2
2013-04-02        45        1

4
এটাই. পিডিএসরিজ.নুনিক যা আমি খুঁজে পেলাম না, ভালভাবে কাজ করতে পারিনি। অন্ধকারে খুব সুস্পষ্ট। ধন্যবাদ!
ডেভ

4
এই উত্তরটি পুরানো। আপনি এখন nuniqueসরাসরি ব্যবহার করতে পারেন । নীচে @ ব্লডউইন পিগের সমাধানটি দেখুন
টেড

ধন্যবাদ @ টেডপেট্রো, আমি কোডার যা পূর্বে ব্লডউইন পিগ নামে পরিচিত;)
রিকি ম্যাকমাস্টার

আরে আপনি কি নন-নকল গণনা পেতে জানেন?
আম্বেলু

62

'নুনিক' পান্ডাস 0.20.0 থেকে .agg () এর জন্য একটি বিকল্প, সুতরাং:

df.groupby('date').agg({'duration': 'sum', 'user_id': 'nunique'})

আক্রমণাত্মক এবং অনন্য মান পেতে কি সম্ভব? ভালো কিছুduration: np.unique
লোক

@ গুয় ট্রাই করুনdf.groupby('date').agg({'user_id': lambda s: s.unique().reset_index(drop=True)})
বলপয়েন্টবেন

কিভাবে আমরা আউটপুট পেতে পারি?

17

ইতিমধ্যে দেওয়া উত্তরগুলিতে কেবল যুক্ত করা, স্ট্রিংটি ব্যবহার করে সমাধানটি "nunique"আরও দ্রুত বলে মনে হচ্ছে, এখানে M 21M সারি ডেটাফ্রেমে পরীক্ষা করা হয়েছে, তারপরে M 2M এ ভাগ করা হয়েছে

%time _=g.agg({"id": lambda x: x.nunique()})
CPU times: user 3min 3s, sys: 2.94 s, total: 3min 6s
Wall time: 3min 20s

%time _=g.agg({"id": pd.Series.nunique})
CPU times: user 3min 2s, sys: 2.44 s, total: 3min 4s
Wall time: 3min 18s

%time _=g.agg({"id": "nunique"})
CPU times: user 14 s, sys: 4.76 s, total: 18.8 s
Wall time: 24.4 s

4
চমৎকার ধরা! আমি অনুমান করি এটি "ল্যাম্বদা" / "অন্যান্য ফাংশন" ক্ষেত্রে এটি খ / সি সিটিক্রমে প্রয়োগ করা হয়, যখন "পরিচিত" ফাংশনগুলি ভেক্টরাইজড ফ্যাশনে পুরো কলামে প্রয়োগ করা হয়।
ইউফোস

@ ব্লডউইন পিগ থেকে কোন সমাধান?
চৌগ

@ ছাগ, দ্রুততম!
এম-ডিজে

@ ছাগ - দুঃখিত আমি আমার ব্যবহারকারীর নামটি পরিবর্তন করেছি। এটা আমি ছিলাম.
রিকি ম্যাকমাস্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.