Python 在熊猫中同时使用loc和iloc
假设我有下面的数据框,我想将Python 在熊猫中同时使用loc和iloc,python,pandas,indexing,dataframe,Python,Pandas,Indexing,Dataframe,假设我有下面的数据框,我想将c列中与a列中等于1的前两个元素对应的两个元素更改为等于2 >>> df = pd.DataFrame({"a" : [1,1,1,1,2,2,2,2], "b" : [2,3,1,4,5,6,7,2], "c" : [1,2,3,4,5,6,7,8]}) >>> df.loc[df["a"] == 1, "c"].iloc[0:2] = 2 >>> df a b c 0 1 2 1 1 1 3
c列中与a列中等于1
的前两个元素对应的两个元素更改为等于2
>>> df = pd.DataFrame({"a" : [1,1,1,1,2,2,2,2], "b" : [2,3,1,4,5,6,7,2], "c" : [1,2,3,4,5,6,7,8]})
>>> df.loc[df["a"] == 1, "c"].iloc[0:2] = 2
>>> df
a b c
0 1 2 1
1 1 3 2
2 1 1 3
3 1 4 4
4 2 5 5
5 2 6 6
6 2 7 7
7 2 2 8
第二行中的代码不起作用,因为iloc设置了一个副本,所以原始数据帧不会被修改。我该怎么做?您可以使用:
如果索引是nice
(从0
开始,无重复项):
df.loc[(df[“a”]=1)和(df.index<2),“c”]=2
打印(df)
a、b、c
0 1 2 2
1 1 3 2
2 1 1 3
3 1 4 4
4 2 5 5
5 2 6 6
6 2 7 7
7 2 2 8
另一个解决方案:
mask = df["a"] == 1
mask = mask & (mask.cumsum() < 3)
df.loc[mask.index[:2], "c"] = 2
print (df)
a b c
0 1 2 2
1 1 3 2
2 1 1 3
3 1 4 4
4 2 5 5
5 2 6 6
6 2 7 7
7 2 2 8
mask=df[“a”]==1
mask=mask&(mask.cumsum()<3)
df.loc[掩码索引[:2],“c”]=2
打印(df)
a、b、c
0 1 2 2
1 1 3 2
2 1 1 3
3 1 4 4
4 2 5 5
5 2 6 6
6 2 7 7
7 2 2 8
肮脏的方式是:
df.loc[df[df['a']==1][:2].index, 'c'] = 2
我不认为这是肮脏的!这是一个切片类的例子,它沿着一个轴定位,通过索引在另一个轴上。我能够保存一个字符:df.loc[df.index[df.a==1][:2],'c']=2
@piRSquared我通常不喜欢df[col]==some\u值]
语法中的重复,这里它变成了df[df[df][
…这就是我为什么称它为肮脏的原因。:)
mask = df["a"] == 1
mask = mask & (mask.cumsum() < 3)
df.loc[mask.index[:2], "c"] = 2
print (df)
a b c
0 1 2 2
1 1 3 2
2 1 1 3
3 1 4 4
4 2 5 5
5 2 6 6
6 2 7 7
7 2 2 8
df.loc[df[df['a']==1][:2].index, 'c'] = 2