我有要按城市和日期分组的数据(单独的列),并使用剩余的列计算新值。更具体地说,其他列是按种族划分的6个种族的人数。因此,我有8列,两列分组,而我想总结6列。我想通过计算熵来总结它们 每个城市日。
但是,城市和日期是字符串,而我的熵函数不喜欢这样。当分组列为int64时,它可以工作。我曾尝试将city和day列转换为虚拟变量,但错误仍然存在。
下面是从this post借用的示例,它使用了我的有效函数。
# 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)
我需要弄清楚如何使newEntropy起作用。似乎应该忽略分组列,但事实并非如此。我也不想将'group2'转换为int64,因为在我的真实数据中它是'YYYY-MM-DD'。我的数据等效于“ group1”也是一个国家/地区名称,我更喜欢保留为字符串。
我应该说我可以创建一个新的数据框,它是我想要的分组,然后对其应用newEntropy。拥有一些更简洁的东西会很不错,感觉应该会更容易。
答案 0 :(得分:1)
在apply
之后,function
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