让我们考虑一个数据帧:
np.random.seed(1)
df = pd.DataFrame({"x": np.random.random(size=10)})
df["y"] = np.where(df.x < 0.5, 0, 1)
输出:
x y
0 0.417022 0
1 0.720324 1
2 0.000114 0
3 0.302333 0
4 0.146756 0
5 0.092339 0
6 0.186260 0
7 0.345561 0
8 0.396767 0
9 0.538817 1
我想添加一个新列z
:
x y z
0 0.417022 0 0
1 0.720324 1 0
2 0.000114 0 1
3 0.302333 0 2
4 0.146756 0 3
5 0.092339 0 4
6 0.186260 0 5
7 0.345561 0 6
8 0.396767 0 7
9 0.538817 1 1
我发现我可以使用apply
函数并尝试map
得出结果,但是它不起作用...
z = df.groupby("y").apply(lambda d: np.arange(d["y"].size))
df["z"] = df["y"].map(z)
输出:
x y z
0 0.417022 0 [0, 1, 2, 3, 4, 5, 6, 7]
1 0.720324 1 [0, 1]
2 0.000114 0 [0, 1, 2, 3, 4, 5, 6, 7]
3 0.302333 0 [0, 1, 2, 3, 4, 5, 6, 7]
4 0.146756 0 [0, 1, 2, 3, 4, 5, 6, 7]
5 0.092339 0 [0, 1, 2, 3, 4, 5, 6, 7]
6 0.186260 0 [0, 1, 2, 3, 4, 5, 6, 7]
7 0.345561 0 [0, 1, 2, 3, 4, 5, 6, 7]
8 0.396767 0 [0, 1, 2, 3, 4, 5, 6, 7]
9 0.538817 1 [0, 1]
您需要的IIUC cumcount
:
df['z'] = df.groupby('y')['y'].cumcount()
print df
x y z
0 0.417022 0 0
1 0.720324 1 0
2 0.000114 0 1
3 0.302333 0 2
4 0.146756 0 3
5 0.092339 0 4
6 0.186260 0 5
7 0.345561 0 6
8 0.396767 0 7
9 0.538817 1 1
更通用的解决方案使用transform
:
df["z"] = df.groupby("y")['y'].transform(lambda d: np.arange(d.size))
print df
x y z
0 0.417022 0 0
1 0.720324 1 0
2 0.000114 0 1
3 0.302333 0 2
4 0.146756 0 3
5 0.092339 0 4
6 0.186260 0 5
7 0.345561 0 6
8 0.396767 0 7
9 0.538817 1 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句