我有一个DataFrame,它包含由列表组成的两列.

一列具有特定项目的类别,另一列具有与该类别相关联的分数.

import pandas as pd

cat = [
    ['speed', 'health', 'strength', 'health'],
    ['strength', 'speed', 'speed'],
    ['strength', 'speed', 'health', 'speed']
]

pts = [
    [1, 2, 1.5, -1],
    [2, -1.5, 1.5],
    [-1, 2, 0, 1.5]
]

s_cat = pd.Series(cat, name='cat')
s_pts = pd.Series(pts, name='pts')

df = pd.concat([s_cat, s_pts], axis=1)

输出:

                                 cat              pts
0  [speed, health, strength, health]  [1, 2, 1.5, -1]
1           [strength, speed, speed]   [2, -1.5, 1.5]
2   [strength, speed, health, speed]  [-1, 2, 0, 1.5]

我想将这些列表联系起来,以获得每个类别的分数之和到新的一栏,如果可能的话,还有每个类别的正负分数的计数.

我预计会是这样的:

                                 cat              pts  speed_sum  health_sum  strength_sum  speed_pos  speed_neg  health_pos  health_neg  strength_pos  strength_neg
0  [speed, health, strength, health]  [1, 2, 1.5, -1]        1.0         1.0           1.5          1          0           1           1             1             0
1           [strength, speed, speed]   [2, -1.5, 1.5]        0.0         NaN           2.0          1          1           0           0             1             0
2   [strength, speed, health, speed]  [-1, 2, 0, 1.5]        3.5         0.0          -1.0          2          0           0           0             0             1

推荐答案

try :

def pos(vals):
    return (vals > 0).sum()


def neg(vals):
    return (vals < 0).sum()


tmp = df.explode(["cat", "pts"])
tmp = tmp.pivot_table(
    index=tmp.index,
    columns="cat",
    values="pts",
    aggfunc=["sum", pos, neg],
)
tmp.columns = [f"{b}_{a}" for a, b in tmp.columns]

out = pd.concat([df, tmp], axis=1)
print(out)

打印:

                                 cat              pts health_sum speed_sum strength_sum  health_pos  speed_pos  strength_pos  health_neg  speed_neg  strength_neg
0  [speed, health, strength, health]  [1, 2, 1.5, -1]          1         1          1.5         1.0        1.0           1.0         1.0        0.0           0.0
1           [strength, speed, speed]   [2, -1.5, 1.5]        NaN       0.0            2         NaN        1.0           1.0         NaN        1.0           0.0
2   [strength, speed, health, speed]  [-1, 2, 0, 1.5]          0       3.5           -1         0.0        2.0           0.0         0.0        0.0           1.0

Python相关问答推荐

Select 用a和i标签包裹的复选框?

在Pandas DataFrame操作中用链接替换'方法的更有效方法

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

Python中的变量每次增加超过1

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

Django admin Csrf令牌未设置

为什么\b在这个正则表达式中不解释为反斜杠

lityter不让我输入左边的方括号,'

numpy.unique如何消除重复列?

如何删除重复的文字翻拍?

numpy数组和数组标量之间的不同行为

在Django中重命名我的表后,旧表中的项目不会被移动或删除

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

裁剪数字.nd数组引发-ValueError:无法将空图像写入JPEG

以极轴表示的行数表达式?

如果服务器设置为不侦听创建,则QWebSocket客户端不连接到QWebSocketServer;如果服务器稍后开始侦听,则不连接

文本溢出了Kivy的视区

如何在python tkinter中绑定键盘上的另一个回车?

我如何为测试函数的参数化提供fixture 生成的数据?如果我可以的话,还有其他 Select 吗?

如何在Django查询集中生成带有值列表的带注释的字段?