我有一个与此类似的数据集:
data = {'lat': [0.15, 0.15, 0.15, 0.15, 0.25, 0.25, 0.48, 0.48, 0.48, 0.48],
'lon': [0.87, 0.87, 0.87, 0.87, 0.12, 0.12, 0.59, 0.59, 0.59, 0.59],
'animal': ['dog', 'cat', 'rat', 'rat', 'cat', 'rat', 'cat', 'dog', 'dog', 'rat'],
'category': ['A', 'C', 'B', 'C', 'B', 'B', 'C', 'A', 'C', 'C']}
mdf = pd.DataFrame(data)
mdf
Out[460]:
lat lon animal category
0 0.15 0.87 dog A
1 0.15 0.87 cat C
2 0.15 0.87 rat B
3 0.15 0.87 rat C
4 0.25 0.12 cat B
5 0.25 0.12 rat B
6 0.48 0.59 cat C
7 0.48 0.59 dog A
8 0.48 0.59 dog C
9 0.48 0.59 rat C我想用“动物”、“lat”和“lon”作为某种索引来获得以下内容:
lat lon animal A B C
0 0.15 0.87 dog True False False
1 0.15 0.87 cat False False True
2 0.15 0.87 rat False True True
4 0.25 0.12 cat False True False
5 0.25 0.12 rat False True False
6 0.48 0.59 cat False False True
7 0.48 0.59 dog True False True
9 0.48 0.59 rat False False True我并不在乎它是否是真/假,1/0等等,只要我能看到“lat”、“long”和“动物”的每种组合都有哪些类别。
我一直在尝试几种没有成功的选择: pivot,pivot_table,groupby,堆栈/un堆栈.但似乎没有人能满足我的需要。
我所剩下的唯一选择就是迭代不同的'lat','lon',‘动物’选项,并检查每个‘类别’是否有出现。
也许这可以通过定义'lat','lon',‘动物’作为指标,并以某种方式“解冻”来实现。
有什么建议吗?
谢谢。
编辑:我没有新的评论,我不知道如何联系关闭的人,所以让我带来一些额外的解释在这里。为你的烦恼道歉。
广,谢谢你引用另一条线。然而,我不确定它是否对我有帮助。
我可以这么做:
pd.get_dummies(mdf['category'], prefix='', prefix_sep='')但我得到了我最初的10行,而不是我瞄准的那张桌子。
为了获得get_dummies有用的东西,我必须这样做:
mdf = mdf.join(pd.get_dummies(mdf['category'], prefix='', prefix_sep=''))
mdf[['A', 'B', 'C']] = mdf.groupby(['lat', 'lon', 'animal'])[['A', 'B', 'C']].transform('sum')
mdf.drop_duplicates(subset=['lat', 'lon', 'animal'], inplace=True)
d = {1: True,
0: False}
mdf[['A', 'B', 'C']] = mdf[['A', 'B', 'C']].replace(d)
mdf.drop('category',
axis=1,
inplace=True)但这似乎太复杂了,我觉得一定有更好的方法.
我也曾想过:
mdf['value'] = [True] * 10
mdf = mdf.set_index(['lat', 'lon', 'animal', 'category'])
mdf = mdf.unstack(fill_value=False)
mdf = mdf.reset_index()
mdf.columns = ['lat', 'lon', 'animal', 'A', 'B', 'C']但又一次,用指数来欺骗系统,似乎是一种不折不扣的.
肯定有更好的办法!
谢谢。
发布于 2020-02-26 09:59:09
我最初的索引值并不重要,您可以使用get_dummies将A、B和C列连接到原始的dataframe,然后按lon和C对它们进行分组,并对布尔列进行求和:
categs = np.sort(mdf['category'].unique())
resul = pd.concat([mdf, pd.get_dummies(mdf['category']).astype(bool)], axis=1
).groupby(['lat', 'lon', 'animal'])[categs].sum().reset_index()它规定:
lat lon animal A B C
0 0.15 0.87 cat False False True
1 0.15 0.87 dog True False False
2 0.15 0.87 rat False True True
3 0.25 0.12 cat False True False
4 0.25 0.12 rat False True False
5 0.48 0.59 cat False False True
6 0.48 0.59 dog True False True
7 0.48 0.59 rat False False Truehttps://stackoverflow.com/questions/60402749
复制相似问题