簡體   English   中英

如何獲取 pandas 中每對唯一列的列值計數?

[英]How to get count of column values for each unique pair of columns in pandas?

我有下面給出的數據

data = [(datetime.datetime(2020, 12, 21, 6, 50, 14, 955551), 'blr', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 7, 6, 0, 242578), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 7, 16, 30, 260692), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 7, 18, 15, 333229), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 7, 29, 0, 839566), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 7, 37, 45, 211979), 'lon', 'del', 'low'), (datetime.datetime(2020, 12, 21, 7, 41, 15, 211376), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 7, 48, 16, 26287), 'lon', 'del', 'low'), (datetime.datetime(2020, 12, 21, 7, 55, 17, 248074), 'ny', 'del', 'low'), (datetime.datetime(2020, 12, 21, 7, 57, 2, 55666), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 8, 4, 2, 319699), 'lon', 'del', 'low'), (datetime.datetime(2020, 12, 21, 8, 25, 5, 982621), 'ny', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 8, 26, 50, 997280), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 8, 39, 7, 14287), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 8, 47, 51, 810956), 'lon', 'del', 'medium'), (datetime.datetime(2020, 12, 21, 9, 37, 23, 99922), 'ny', 'del', 'low')]

這就是我在 pandas 中加載它的方式

import pandas as pd
import datetime

df = pd.DataFrame(data)
df.columns = ["date", "start", "end", "type"]
df.set_index('date', inplace=True)

現在我可以通過執行類似的操作來獲取所有具有特定類型的行,例如medium

print(df[df.values == 'medium'])

現在我想知道對於每一對獨特的startend ,什么是medium類型的計數? 基本上我想要類似的東西

blr del 1
lon del 9
ny  del 1

但我不確定我怎樣才能得到它。 如何才能做到這一點?

使用GroupBy.size和 spcify 列進行測試:

s1 = df[df.values == 'medium'].groupby(['start','end']).size()
print (s1)
start  end
blr    del    1
lon    del    9
ny     del    1
dtype: int64

或者如果想要所有組合也與type

print(df.groupby(['type','start','end']).size())
type    start  end
low     lon    del    3
        ny     del    2
medium  blr    del    1
        lon    del    9
        ny     del    1
dtype: int64


print (s.loc['medium'])
start  end
blr    del    1
lon    del    9
ny     del    1
dtype: int64


print (s.loc['low'])
start  end
lon    del    3
ny     del    2
dtype: int64

使用value_counts

res = df[df['type'].eq('medium')].value_counts()
print(res)

Output

start  end  type  
lon    del  medium    9
ny     del  medium    1
blr    del  medium    1
dtype: int64

從文檔中:

返回一個 Series,其中包含 DataFrame 中唯一行的計數。

如果要從 output 中刪除類型,請按照@jezrael 的建議使用 droplevel:

res = df[df['type'].eq('medium')].value_counts().droplevel(level=-1)
print(res)

Output

start  end
lon    del    9
ny     del    1
blr    del    1
dtype: int64

這也可以擴展到所有類型,例如,使用:

res = df.value_counts(subset=['type', 'start', 'end']).sort_index(level=0)
print(res)

Output

type    start  end
low     lon    del    3
        ny     del    2
medium  blr    del    1
        lon    del    9
        ny     del    1
dtype: int64
df.where(lambda x:x.type == "medium").dropna().groupby(['start', 'end']).type.agg("count")
start  end
blr    del    1
lon    del    9
ny     del    1
Name: type, dtype: int64

暫無
暫無

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

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