我有一个excel表格的数据,我已经总结在熊猫交叉表。我希望通过与相关行相加来进一步对数据进行分类。
这是我的交叉表:
所有用户-公民0 0 36 0 36民用/政府0 0 2 0 2商业3 99 412 0 514政府9 14 38 0 61政府/民事0 10 0 10政府/商业政府/军事0 0 1 0 1军事9 67 66 142军事/民用0 0 2 0 2军事/商业0 0 0 32 32 21 182 648 32 883
我只想要四个团体:民用,政府,商业和军事。如果“政府”在名称中,我想把包含它的所有行加起来。如果“军事”在这个名字里,我想把这些行相加成一列.
做这件事最好的方法是什么?
发布于 2019-07-18 20:22:12
pd.crosstab
从一开始就做
pd.crosstab(df.users.str.split('/').str[0], df.class_of_orbit)groupby
在你已经拥有的基础上。如果将可调用的值传递给groupby,它将将其应用于索引,并使用结果对by进行分组。
xtab.groupby(lambda x: x.split('/')[0]).sum()
Elliptical GEO LEO MEO All
All 21 182 648 32 883
Civil 0 0 38 0 38
Commercial 3 99 412 0 514
Government 9 16 130 0 155
Military 9 67 68 32 176
发布于 2019-07-18 20:22:12
按每个名称的第一部分进行分组会产生
df.groupby(df.class_of_orbit.str.split('/').str.get(0)).sum()
Elliptical GEO LEO MEO All
class_of_orbit
All 21 182 648 32 883
Civil 0 0 38 0 38
Commercial 3 99 412 0 514
Government 9 16 130 0 155
Military 9 67 68 32 176发布于 2019-07-18 22:10:43
爱拉斐尔和piRSquared的答案,但是如果你想把所有只有组实例的行加在一起,而不仅仅是这个组是名字的第一部分,你可以稍微修改一下piRsquared的答案。
您可以定义一个助手函数来检查一个名称是否有第二个部分,然后创建一个第二个数据帧,其中包含那些包含名称第二部分的行的和。然后将这个元素与拉斐尔和piRSquared的结果相加。我忽略了“所有”的观察,但是它可以很容易地从结果数据框架中计算出来。
希望没事,我是新来的。
def second_parts_sum(x):
if len(x.split('/')) > 1:
return x.split('/')[1]
else:
return 'to_be_dropped'
first_parts = xtab.groupby(lambda x: x.split('/')[0]).sum()
second_parts = xtab.groupby(lambda x: second_parts_sum(x)).sum()
first_parts = first_parts[first_parts.index != 'All']
second_parts = second_parts[second_parts.index != 'to_be_dropped']
first_parts + second_parts
Elliptical GEO LEO MEO All
Civil 0 0 50 0 50
Commercial 3 101 493 32 629
Government 9 16 132 0 157
Military 9 67 69 32 177https://stackoverflow.com/questions/57101797
复制相似问题