Pandas groupby() 比较并计算两列
Pandas groupby() compare and count two columns
我有以下 Pandas 数据框:
name1 name2
A B
A A
A C
A A
B B
B A
我想添加一个名为 new
的列,它计算每组 name1
name1
与 name2
相同的频率。
因此,预期的输出是以下数据帧:
name1 name2 new
A B 2
A A 2
A C 2
A A 2
B B 1
B A 1
我尝试了以下方法,但出现错误:
df['new'] = df.groupby('name1').apply(lambda x: (x[x['name1'] == x['name2']].fillna(False).sum()))
TypeError: incompatible index of inserted column with frame index
您可以将 name1
与 name2
进行比较,然后按 name1
和 sum
分组 Trues:
df['new'] = df.name2.eq(df.name1).astype(int).groupby(df.name1).transform('sum')
df
# name1 name2 new
#0 A B 2
#1 A A 2
#2 A C 2
#3 A A 2
#4 B B 1
#5 B A 1
或者如果使用 apply
,首先聚合计数,然后使用 map
生成 new
列:
cnt = df.groupby('name1').apply(lambda g: (g.name1 == g.name2).sum())
df['new'] = df.name1.map(cnt)
时间:
df = pd.concat([df]*10000)
%timeit df['new'] = df.name2.eq(df.name1).astype(int).groupby(df.name1).transform('sum')
# 100 loops, best of 3: 4.85 ms per loop
%%timeit
cnt = df.groupby('name1').apply(lambda g: (g.name1 == g.name2).sum())
df['new'] = df.name1.map(cnt)
# 10 loops, best of 3: 22.1 ms per loop
我有以下 Pandas 数据框:
name1 name2
A B
A A
A C
A A
B B
B A
我想添加一个名为 new
的列,它计算每组 name1
name1
与 name2
相同的频率。
因此,预期的输出是以下数据帧:
name1 name2 new
A B 2
A A 2
A C 2
A A 2
B B 1
B A 1
我尝试了以下方法,但出现错误:
df['new'] = df.groupby('name1').apply(lambda x: (x[x['name1'] == x['name2']].fillna(False).sum()))
TypeError: incompatible index of inserted column with frame index
您可以将 name1
与 name2
进行比较,然后按 name1
和 sum
分组 Trues:
df['new'] = df.name2.eq(df.name1).astype(int).groupby(df.name1).transform('sum')
df
# name1 name2 new
#0 A B 2
#1 A A 2
#2 A C 2
#3 A A 2
#4 B B 1
#5 B A 1
或者如果使用 apply
,首先聚合计数,然后使用 map
生成 new
列:
cnt = df.groupby('name1').apply(lambda g: (g.name1 == g.name2).sum())
df['new'] = df.name1.map(cnt)
时间:
df = pd.concat([df]*10000)
%timeit df['new'] = df.name2.eq(df.name1).astype(int).groupby(df.name1).transform('sum')
# 100 loops, best of 3: 4.85 ms per loop
%%timeit
cnt = df.groupby('name1').apply(lambda g: (g.name1 == g.name2).sum())
df['new'] = df.name1.map(cnt)
# 10 loops, best of 3: 22.1 ms per loop