2 回答
TA贡献1825条经验 获得超4个赞
你可以用Series.str.get_dummies,Series.mul和Series.sum:
df['A'].str.get_dummies(sep=',').mul(df['B'], axis=0).sum()
a 210
b 210
c 10
d 210
e 200
解释
df.A.str.get_dummies(sep=',')
这会产生一个如下所示的 DataFrame:
a b c d e
0 1 1 1 1 0
1 1 1 1 1 0
2 1 1 0 1 1
3 1 1 0 1 1
然后.mul与您的值列一起使用将产生:
a b c d e
0 0 0 0 0 0
1 10 10 10 10 0
2 89 89 0 89 89
3 111 111 0 111 111
最后,.sum沿索引轴应用将为您提供最终输出:
a 210
b 210
c 10
d 210
e 200
TA贡献1785条经验 获得超8个赞
这是我会使用的步骤
在“,”上拆分并用于
expand=True获取数据框,其中每个字母都在其自己的列中(我现在假设,根据您的示例,您总是具有相同的拆分数量?这是真的吗?)“融化”那个数据框,这样就不用从原始 df 的每一行创建多列,你有一个长数据框,其中每一行都是一个字母,它在原始 df 中的索引。
从索引转换为
B列中的值按字母和总和分组
B。
import pandas as pd
data = [
("a,b,c,d", 0),
("a,b,c,d", 10),
("a,b,d,e", 89),
("a,b,d,e", 111),
]
df = pd.DataFrame(data, columns=["A", "B"])
# A B
# 0 a,b,c,d 0
# 1 a,b,c,d 10
# 2 a,b,d,e 89
# 3 a,b,d,e 111
melted = df.A.str.split(",", expand=True).reset_index().melt(id_vars="index", value_name="A")
melted["B"] = df.B.loc[melted["index"]].values
melted.groupby("A").B.sum()
# value
# a 210
# b 210
# c 10
# d 210
# e 200
注意 - 我认为您在问题中的总和不正确;他们中的一些人似乎在 10 点之前下班。
添加回答
举报
