import pandas as pd
df = pd.DataFrame(columns=['A','B'])
df['A']=['A','B','A','A','B','B','B']
df['B']=[2,4,3,5,6,7,8]
df
A B
0 A 2
1 B 4
2 A 3
3 A 5
4 B 6
5 B 7
6 B 8
df.columns=['id','num']
df
id num
0 A 2
1 B 4
2 A 3
3 A 5
4 B 6
5 B 7
6 B 8
我想对id列应用groupby,但对num列应用某些条件
我想在最终数据帧中有2列is_even_count和is_odd_count列,其中is_even_count仅对分组后num列中的偶数进行计数,而is_odd_count仅对分组后num列中的奇数进行计数。
我的输出将是
is_even_count is_odd_count
A 1 2
B 3 1
我该怎么在熊猫上做
答案 0 :(得分:0)
使用除以2
的模数,然后将1
与map
进行比较:
d = {True:'is_odd_count', False:'is_even_count'}
df = df.groupby(['id', (df['num'] % 2 == 1).map(d)]).size().unstack(fill_value=0)
print (df)
num is_even_count is_odd_count
id
A 1 2
B 3 1
使用crosstab
的另一种解决方案:
df = pd.crosstab(df['id'], (df['num'] % 2 == 1).map(d))
替代numpy.where
:
a = np.where(df['num'] % 2 == 1, 'is_odd_count', 'is_even_count')
df = pd.crosstab(df['id'], a)