首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将列值移动到具有True/False的值

将列值移动到具有True/False的值
EN

Stack Overflow用户
提问于 2020-02-25 20:36:09
回答 1查看 220关注 0票数 0

我有一个与此类似的数据集:

代码语言:javascript
运行
复制
 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”作为某种索引来获得以下内容:

代码语言:javascript
运行
复制
      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',‘动物’作为指标,并以某种方式“解冻”来实现。

有什么建议吗?

谢谢。

编辑:我没有新的评论,我不知道如何联系关闭的人,所以让我带来一些额外的解释在这里。为你的烦恼道歉。

广,谢谢你引用另一条线。然而,我不确定它是否对我有帮助。

我可以这么做:

代码语言:javascript
运行
复制
pd.get_dummies(mdf['category'], prefix='', prefix_sep='')

但我得到了我最初的10行,而不是我瞄准的那张桌子。

为了获得get_dummies有用的东西,我必须这样做:

代码语言:javascript
运行
复制
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)

但这似乎太复杂了,我觉得一定有更好的方法.

我也曾想过:

代码语言:javascript
运行
复制
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']

但又一次,用指数来欺骗系统,似乎是一种不折不扣的.

肯定有更好的办法!

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-26 09:59:09

我最初的索引值并不重要,您可以使用get_dummiesABC列连接到原始的dataframe,然后按lon和C对它们进行分组,并对布尔列进行求和:

代码语言:javascript
运行
复制
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()

它规定:

代码语言:javascript
运行
复制
    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   True
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60402749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档