Python groupby无法识别数字列的问题

Python groupby无法识别数字列的问题,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个excel数据,我是通过pd读取的。读取excel: Block Concentration Name Replicate 1 Array Marker 1 Array Marker 1 100.0 Man5GlcNAc2 1 33.0 Man5GlcNAc2 1

我有一个excel数据,我是通过pd读取的。读取excel:

Block   Concentration       Name            Replicate
  1                      Array Marker   
  1                      Array Marker   
  1       100.0        Man5GlcNAc2  
  1       33.0         Man5GlcNAc2  
  1       10.0         Man5GlcNAc2  
  1       100.0        Man6GlcNAc2  
  1       33.0         Man6GlcNAc2  
  1        10.0        Man6GlcNAc2  
  1        100.0      Man7GlcNAc2 D1    
  1        33.0       Man7GlcNAc2 D1    
  1        10.0       Man7GlcNAc2 D1    
  1        100.0     Man7GlcNAc2 D3 
  1         33.0    Man7GlcNAc2 D3  
  1         10.0    Man7GlcNAc2 D3  
...
...
  2        100.0    Man8GlcNAc2 D1D3    
  2         33.0    Man8GlcNAc2 D1D3    
  2         10.0    Man8GlcNAc2 D1D3    
  2         100.0   Man9GlcNAc2 
  2        33.0     Man9GlcNAc2 
  2        10.0     Man9GlcNAc2 
...
所需输出为:

Block   Concentration       Name            Replicate
  1                      Array Marker         1
  1                      Array Marker         2
  1       100.0        Man5GlcNAc2            1
  1       33.0         Man5GlcNAc2            2
  1       10.0         Man5GlcNAc2            3
  1       100.0        Man6GlcNAc2            1
  1       33.0         Man6GlcNAc2            2
  1        10.0        Man6GlcNAc2            3
  1        100.0      Man7GlcNAc2 D1          1
  1        33.0       Man7GlcNAc2 D1          2
  1        10.0       Man7GlcNAc2 D1          3
  1        100.0     Man7GlcNAc2 D3           1
  1         33.0    Man7GlcNAc2 D3            2
  1         10.0    Man7GlcNAc2 D3            3
...
...
  2        100.0    Man8GlcNAc2 D1D3          1
  2         33.0    Man8GlcNAc2 D1D3          2
  2         10.0    Man8GlcNAc2 D1D3          3
  2         100.0   Man9GlcNAc2               1
  2        33.0     Man9GlcNAc2               2
  2        10.0     Man9GlcNAc2               3
...
我的密码是

data["Replicate"] = data.groupby(["Block", "Name", "Concentration"]).cumcount()+1 
我认为这是有道理的,但我得到的输出不是期望的输出,它如下所示:

Block   Concentration       Name            Replicate
  1                      Array Marker         1
  1                      Array Marker         2
  1       100.0        Man5GlcNAc2            1
  1       33.0         Man5GlcNAc2            1
  1       10.0         Man5GlcNAc2            1
  1       100.0        Man6GlcNAc2            1
  1       33.0         Man6GlcNAc2            1
  1        10.0        Man6GlcNAc2            1
  1        100.0      Man7GlcNAc2 D1          1
  1        33.0       Man7GlcNAc2 D1          1
  1        10.0       Man7GlcNAc2 D1          1
  1        100.0     Man7GlcNAc2 D3           1
  1         33.0    Man7GlcNAc2 D3            1
  1         10.0    Man7GlcNAc2 D3            1
...
...
  1        100.0    Man8GlcNAc2 D1D3          1
  1         33.0    Man8GlcNAc2 D1D3          1
  1         10.0    Man8GlcNAc2 D1D3          1
  1         100.0   Man9GlcNAc2               1
  1        33.0     Man9GlcNAc2               1
  1        10.0     Man9GlcNAc2               1
...
  1         100.0   Man5GlcNAc2               2
  1        33.0     Man5GlcNAc2               2
  1        10.0     Man5GlcNAc2               2
 ....

复制列在后面的行中一直是“1”,我不确定它是如何选择要将数字分配给哪些行的。应该总共有3个相同的block | concentration | name组合,因此我需要为每个组合指定“1,2,3”,以便在以后使用透视表时将它们分开。我已将“浓度”列设置为字符串类型,因此使用数字应该不会有问题。

如果从组中删除“浓度”,您将获得预期的输出

data["Replicate"] = data.groupby(["Block", "Name"]).cumcount()+1
>>> data

    Block Concentration             Name  Replicate
0       1            ''     Array.Marker          1
1       1            ''     Array.Marker          2
2       1         100.0      Man5GlcNAc2          1
3       1          33.0      Man5GlcNAc2          2
4       1          10.0      Man5GlcNAc2          3
5       1         100.0      Man6GlcNAc2          1
6       1          33.0      Man6GlcNAc2          2
7       1          10.0      Man6GlcNAc2          3
8       1         100.0    Man7GlcNAc2D1          1
9       1          33.0    Man7GlcNAc2D1          2

如果你将“注意力”从你的团队中移除,你将获得预期的输出

data["Replicate"] = data.groupby(["Block", "Name"]).cumcount()+1
>>> data

    Block Concentration             Name  Replicate
0       1            ''     Array.Marker          1
1       1            ''     Array.Marker          2
2       1         100.0      Man5GlcNAc2          1
3       1          33.0      Man5GlcNAc2          2
4       1          10.0      Man5GlcNAc2          3
5       1         100.0      Man6GlcNAc2          1
6       1          33.0      Man6GlcNAc2          2
7       1          10.0      Man6GlcNAc2          3
8       1         100.0    Man7GlcNAc2D1          1
9       1          33.0    Man7GlcNAc2D1          2

与函数
cumcount()+1
不同,它可以与
移动窗口=3
一起使用:

#groupby and set rolling count from column Block
data["Replicate"] = data.groupby(["Block", "Name"])["Block"].transform(pd.rolling_count, window=3) 
格式很奇怪。如果将数据复制到问题中没有问题,您可以通过将列
浓度
强制转换为浮动,并将列
名称
中的空格从文本的开始和结束处分条来修复它。


与函数
cumcount()+1
不同,它可以与
移动窗口=3
一起使用:

#groupby and set rolling count from column Block
data["Replicate"] = data.groupby(["Block", "Name"])["Block"].transform(pd.rolling_count, window=3) 
格式很奇怪。如果将数据复制到问题中没有问题,您可以通过将列
浓度
强制转换为浮动,并将列
名称
中的空格从文本的开始和结束处分条来修复它。


该数据的格式看起来有点奇怪。你确定它被正确读入了吗?@BrenBarn是的,它被正确读入了。我在这里手动输入了数据,所以格式看起来不正确。很抱歉,为什么街区不是最后一排的1号就是2号。“看来你不应该按注意力来分组。”皮埃尔·拉福琼我明白了,我想我用错了函数来实现我想要的。我应该使用什么函数来代替?@Pierre Laforenti我正在考虑删除空的浓度行,只保留3种类型:100、33和10。数据的格式看起来有点奇怪。你确定它被正确读入了吗?@BrenBarn是的,它被正确读入了。我在这里手动输入了数据,所以格式看起来不正确。很抱歉,为什么街区不是最后一排的1号就是2号。“看来你不应该按注意力来分组。”皮埃尔·拉福琼我明白了,我想我用错了函数来实现我想要的。我应该使用什么功能来代替?@Pierre Laforenti我正在考虑删除空浓度行,只保留3种类型:100、33和10010@Jessica嗯?这里没有计算为1-7的“空”。这个问题毫无意义。@Jessica,嗯?这里没有计算为1-7的“空”。这个问题毫无意义。
    Block Concentration            Name  Replicate
0       1                  Array Marker          1
1       1                  Array Marker          2
2       1           100     Man5GlcNAc2          1
3       1            33     Man5GlcNAc2          2
4       1            10     Man5GlcNAc2          3
5       1           100     Man6GlcNAc2          1
6       1            33     Man6GlcNAc2          2
7       1            10     Man6GlcNAc2          3
8       1           100  Man7GlcNAc2 D1          1
9       1            33  Man7GlcNAc2 D1          2
10      1            10  Man7GlcNAc2 D1          3
11      1           100  Man7GlcNAc2 D3          1
12      1            33  Man7GlcNAc2 D3          2
13      1            10  Man7GlcNAc2 D3          3