组内分组
Groupby within groups
我有这样的数据:
df = pd.DataFrame({
'a': ['milk', 'eggs', 'eggs', 'butter', 'butter',
'milk', 'eggs', 'eggs', 'butter', 'butter'],
'b': ['billy', 'bob', 'frank', 'frank', 'sue',
'frank', 'sue', 'sue', 'sue', 'sue'],
'c': ['1/30', '1/30', '1/31', '1/31', '1/31',
'3/31', '3/31', '3/31', '5/31', '5/31'],
}, index=list('ABCDEFGHIJ'))
我想要 b 中 c 的每个不同值的计数的倒数。 Billy 和 Bob 在 c 中各有一个不同的值,因此他们的计数都等于 1。 Frank 有两个日期,所以他的是 0.5,等等
期望的输出:
A 1.000000
B 1.000000
C 0.500000
D 0.500000
E 0.333333
F 0.500000
G 0.333333
H 0.333333
I 0.333333
J 0.333333
dtype: float64
我想我需要操纵 groupby(some group).count()
and/or groupby(some group).transform('count')
,但我不确定如何操纵它们以及我还需要什么(如果有的话)- 或者是否有更好的方法。
我尝试了
的变体
df.groupby(['b', 'c'], as_index=False)['c'].transform('count').reset_index()
(基于),无济于事。
我可能想出一种“丑陋”的方式,但我非常想知道如何在 1-2 行中做到这一点(如果可能的话)。
谢谢!
我确定有更好的方法,我真的不熟悉 Pandas 基础知识以外的任何东西,但这似乎可以满足您的要求:
df.merge(pd.DataFrame(1 / df.groupby("b")["c"].nunique()).reset_index(), on="b").set_index(df.index)
输出:
a b c_x c_y
A milk billy 1/30 1.000000
B eggs bob 1/30 1.000000
C eggs frank 1/31 0.500000
D butter frank 1/31 0.500000
E milk frank 3/31 0.500000
F butter sue 1/31 0.333333
G eggs sue 3/31 0.333333
H eggs sue 3/31 0.333333
I butter sue 5/31 0.333333
J butter sue 5/31 0.333333
groupby.transform
应该足够了:
1/ df.groupby("b").c.transform("nunique")
A 1.000000
B 1.000000
C 0.500000
D 0.500000
E 0.333333
F 0.500000
G 0.333333
H 0.333333
I 0.333333
J 0.333333
Name: c, dtype: float64
我有这样的数据:
df = pd.DataFrame({
'a': ['milk', 'eggs', 'eggs', 'butter', 'butter',
'milk', 'eggs', 'eggs', 'butter', 'butter'],
'b': ['billy', 'bob', 'frank', 'frank', 'sue',
'frank', 'sue', 'sue', 'sue', 'sue'],
'c': ['1/30', '1/30', '1/31', '1/31', '1/31',
'3/31', '3/31', '3/31', '5/31', '5/31'],
}, index=list('ABCDEFGHIJ'))
我想要 b 中 c 的每个不同值的计数的倒数。 Billy 和 Bob 在 c 中各有一个不同的值,因此他们的计数都等于 1。 Frank 有两个日期,所以他的是 0.5,等等
期望的输出:
A 1.000000
B 1.000000
C 0.500000
D 0.500000
E 0.333333
F 0.500000
G 0.333333
H 0.333333
I 0.333333
J 0.333333
dtype: float64
我想我需要操纵 groupby(some group).count()
and/or groupby(some group).transform('count')
,但我不确定如何操纵它们以及我还需要什么(如果有的话)- 或者是否有更好的方法。
我尝试了
的变体df.groupby(['b', 'c'], as_index=False)['c'].transform('count').reset_index()
(基于
我可能想出一种“丑陋”的方式,但我非常想知道如何在 1-2 行中做到这一点(如果可能的话)。
谢谢!
我确定有更好的方法,我真的不熟悉 Pandas 基础知识以外的任何东西,但这似乎可以满足您的要求:
df.merge(pd.DataFrame(1 / df.groupby("b")["c"].nunique()).reset_index(), on="b").set_index(df.index)
输出:
a b c_x c_y
A milk billy 1/30 1.000000
B eggs bob 1/30 1.000000
C eggs frank 1/31 0.500000
D butter frank 1/31 0.500000
E milk frank 3/31 0.500000
F butter sue 1/31 0.333333
G eggs sue 3/31 0.333333
H eggs sue 3/31 0.333333
I butter sue 5/31 0.333333
J butter sue 5/31 0.333333
groupby.transform
应该足够了:
1/ df.groupby("b").c.transform("nunique")
A 1.000000
B 1.000000
C 0.500000
D 0.500000
E 0.333333
F 0.500000
G 0.333333
H 0.333333
I 0.333333
J 0.333333
Name: c, dtype: float64