Python 例如,对按字符串索引分组的数据应用自定义函数

Python 例如,对按字符串索引分组的数据应用自定义函数,python,pandas,apply,Python,Pandas,Apply,我有数据要按城市和日期分组(单独列),并使用剩余列计算新值。更具体地说,其他列是6场比赛中按种族划分的人数。因此,我有8个专栏,两个分组专栏和6个我想总结的专栏。我想通过计算熵来总结它们 每城市一天 然而,城市和日子是字符串,我的熵函数不喜欢这样。当分组列为int64时,它工作。我试图将city和day列转换为虚拟变量,但错误仍然存在 借用,下面是一个使用my函数的示例 # The function def newEntropy(x): A = x pA = A / A.sum

我有数据要按城市和日期分组(单独列),并使用剩余列计算新值。更具体地说,其他列是6场比赛中按种族划分的人数。因此,我有8个专栏,两个分组专栏和6个我想总结的专栏。我想通过计算熵来总结它们 每城市一天

然而,城市和日子是字符串,我的熵函数不喜欢这样。当分组列为int64时,它工作。我试图将city和day列转换为虚拟变量,但错误仍然存在

借用,下面是一个使用my函数的示例

# The function
def newEntropy(x):
    A = x

    pA = A / A.sum()
    Shannon2 = -np.nansum(pA * np.log2(pA))

    return Shannon2

# Make fake data
df = pd.DataFrame(np.random.rand(20,5), columns=list('abcde'))
df['group'] = [0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4, 5, 5]
df['group2'] = [6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10]

# Works
df.groupby(['group', 'group2']).apply(newEntropy)

# Having an index column that is a string causes failure
df['group2'] = df['group2'].astype('str')
df.groupby(['group', 'group2']).apply(newEntropy)
我需要弄清楚如何让新熵起作用。它似乎应该忽略分组列,但事实并非如此。我也不希望将“group2”转换为int64,因为在我的实际数据中,它是“YYYY-MM-DD”。我的数据相当于'group1'也是一个国家名称,我更喜欢将其保留为字符串


我应该说,我可以创建一个新的数据帧,这是我想要的分组,然后对其应用新熵。如果能有更简洁的内容就好了,感觉应该更简单。

您想在
groupby
之后应用
函数
的具体列如何

df.groupby(['group', 'group2'])[list('abcde')].apply(newEntropy)
Out[191]: 
group  group2
0      6         6.057044
       7        -0.000000
1      7         4.485942
2      7         4.879091
       8         3.727744
       9        -0.000000
3      9         4.751447
4      9        -0.000000
       10        8.993928
5      10        4.191522
dtype: float64

太棒了,谢谢。一个小小的修改:df.groupby(['group','group2'])[list('abcde')].agg('sum').apply(newEntropy)