gpt4 book ai didi

python - 在python pandas中设置切片中第一项的值

转载 作者:太空狗 更新时间:2023-10-29 17:30:37 27 4
gpt4 key购买 nike

所以我想制作一个数据帧的切片,然后在不复制数据帧的情况下设置该切片中第一项的值。例如:

df = pandas.DataFrame(numpy.random.rand(3,1))
df[df[0]>0][0] = 0

这里的切片是无关紧要的,只是为了示例,将再次返回整个数据帧。重点是,通过像示例中那样进行操作,您将获得带有复制警告的设置(可以理解)。我也试过先切片,然后使用 ILOC/IX/LOC 并使用 ILOC 两次,即类似:

df.iloc[df[0]>0,:][0] = 0
df[df[0]>0,:].iloc[0] = 0

而且这些都不起作用。再次重申——我不想复制数据帧,即使它只是切片版本。

编辑:似乎有两种方法,使用掩码或 IdxMax。如果您的索引是唯一的,则 IdxMax 方法似乎有效,如果不是,则使用掩码方法。就我而言,索引不是唯一的,我忘记在最初的帖子中提到这一点。

最佳答案

我想你可以使用 idxmax获取第一个 True 值的索引,然后由 loc 设置:

np.random.seed(1)
df = pd.DataFrame(np.random.randint(4, size=(5,1)))
print (df)
0
0 1
1 3
2 0
3 0
4 3

print ((df[0] == 0).idxmax())
2

df.loc[(df[0] == 0).idxmax(), 0] = 100
print (df)
0
0 1
1 3
2 100
3 0
4 3

df.loc[(df[0] == 3).idxmax(), 0] = 200
print (df)
0
0 1
1 200
2 0
3 0
4 3

编辑:

没有唯一索引的解决方案:

np.random.seed(1)
df = pd.DataFrame(np.random.randint(4, size=(5,1)), index=[1,2,2,3,4])
print (df)
0
1 1
2 3
2 0
3 0
4 3

df = df.reset_index()
df.loc[(df[0] == 3).idxmax(), 0] = 200
df = df.set_index('index')
df.index.name = None
print (df)
0
1 1
2 200
2 0
3 0
4 3

编辑1:

使用 MultiIndex 的解决方案:

np.random.seed(1)
df = pd.DataFrame(np.random.randint(4, size=(5,1)), index=[1,2,2,3,4])
print (df)
0
1 1
2 3
2 0
3 0
4 3

df.index = [np.arange(len(df.index)), df.index]
print (df)
0
0 1 1
1 2 3
2 2 0
3 3 0
4 4 3

df.loc[(df[0] == 3).idxmax(), 0] = 200
df = df.reset_index(level=0, drop=True)

print (df)
0
1 1
2 200
2 0
3 0
4 3

编辑2:

cumsum 的解决方案:

np.random.seed(1)
df = pd.DataFrame([4,0,4,7,4], index=[1,2,2,3,4])
print (df)
0
1 4
2 0
2 4
3 7
4 4

mask = (df[0] == 0).cumsum().cumsum()
print (mask)
1 0
2 1
2 2
3 3
4 4
Name: 0, dtype: int32

df.loc[mask == 1, 0] = 200
print (df)
0
1 4
2 200
2 4
3 7
4 4

关于python - 在python pandas中设置切片中第一项的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42516070/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com