使用带分类值的 Pandas series 获取总和

3

我目前正在处理一个包含有关T恤订单信息的数据框,其中我有一个类似于以下内容的系列:

 '2 s',
 '1 s 2 l',
 '1 s 1 m',
 '1 m 1 l',
 '2 xl',
 '1 s',
 '1 m',
 '1 s',
 '1 m',
 '1 m',
 '1 m',
 '1 s 1 xl',
 '1xxl 1x 2xl',

这些数据点是手动输入的,我正在寻找一种方法来找出特定尺寸所有项目的总和,即我想找到所有s、所有m等的总和。目前我有些不确定如何继续;我考虑拆分每个条目并进行一些编码,然后使用groupbys。


1
似乎输入太自由化了。最后一行应该如何解释?“1xxl 1x 2xl” - tdy
2个回答

1
如果您有数据框:
          sizes
0           2 s
1       1 s 2 l
2       1 s 1 m
3       1 m 1 l
4          2 xl
5           1 s
6           1 m
7           1 s
8           1 m
9           1 m
10          1 m
11     1 s 1 xl
12  1xxl 1x 2xl

然后:

df = (
    df["sizes"]
    .str.extractall(r"(\d+)([\sa-z]+)")
    .reset_index(drop=True)
    .rename(columns={0: "count", 1: "size"})
)
df["size"] = df["size"].str.strip()
df["count"] = df["count"].astype(int)

print(df.pivot_table(columns="size", aggfunc="sum"))

输出:

size   l  m  s  x  xl  xxl
count  3  6  7  1   5    1

0

我认为Andrej对这个问题给出了很好的答案,但是对于新用户来说,详细说明一下正在发生的事情也可能很有用

  1. 我们想要使用Series.str.extractall()中的一些正则表达式提取来捕获匹配组,在这里,组是(1个或多个数字)后跟(1个或多个字母)。如果extractall找到多组匹配,那么它们将在新行上写入,并标明匹配编号

  2. 重置索引会消除“匹配索引”,当然您可以重新命名列并适当格式化值

>>> df
         sizes
0          2 s
1          1 l
2      1 m 1 l
3  1xxl 1x 2xl
>>> df['sizes'].str.extractall(r"(\d+)([\sa-z]+)")
         0     1
  match
0 0      2     s
1 0      1     l
2 0      1    m
  1      1     l
3 0      1  xxl
  1      1    x
  2      2    xl
>>> df['sizes'].str.extractall(r"(\d+)([\sa-z]+)").reset_index(drop=True)
   0     1
0  2     s
1  1     l
2  1    m
3  1     l
4  1  xxl
5  1    x
6  2    xl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接