Python groupby无法识别数字列的问题
我有一个excel数据,我是通过pd读取的。读取excel: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
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