Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在熊猫中同时使用loc和iloc_Python_Pandas_Indexing_Dataframe - Fatal编程技术网

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