在pandas DataFrame中设置特定单元格的值

我创build了一个pandasDataFrame

df=DataFrame(index=['A','B','C'], columns=['x','y']) 

并得到这个

     XY
 NaN NaN
 B NaN NaN
 C NaN NaN

然后,我想为特定的单元格赋值,例如行“C”和列“x”。 我期望得到这样的结果:

     XY
 NaN NaN
 B NaN NaN
 C 10 NaN

与此代码:

 df.xs('C')['x']=10 

但是df的内容没有改变。 在数据框中再次只有南。

有什么build议么?

RukTech的答案 , df.set_value('C', 'x', 10) ,比我在下面build议的选项快得多。 但是,它已被定为贬值

outlook未来, 推荐的方法是.iat/.at


为什么df.xs('C')['x']=10不起作用:

df.xs('C')默认情况下,会返回一个新的数据框和一个数据副本 ,所以

 df.xs('C')['x']=10 

只修改这个新的dataframe。

df['x']返回dfdataframe的视图,所以

 df['x']['C'] = 10 

修改df本身。

警告 :有时难以预测操作是否返回副本或视图。 为此, 文档build议避免使用“链接索引”进行分配 。


所以推荐的select是

 df.at['C', 'x'] = 10 

修改df


 In [18]: %timeit df.set_value('C', 'x', 10) 100000 loops, best of 3: 2.9 µs per loop In [20]: %timeit df['x']['C'] = 10 100000 loops, best of 3: 6.31 µs per loop In [81]: %timeit df.at['C', 'x'] = 10 100000 loops, best of 3: 9.2 µs per loop 

最快的方法是使用set_value 。 这个方法比.ix方法快100倍。 例如:

df.set_value('C', 'x', 10)

推荐的方法(根据维护者)设置一个值是:

 df.ix['x','C']=10 

使用“链接索引”( df['x']['C'] )可能会导致问题。

看到:

您也可以使用.loc进行条件查找,如下所示:

 df.loc[df[<some_column_name>] == <condition>, <another_column_name>] = <value_to_add> 

其中<some_column_name是要检查<condition>variables的列,而<another_column_name>是要添加到的列(可以是新列或已存在的列)。 <value_to_add>是要添加到该列/行的值。

这个例子并不适用于手头的问题,但是对于某些人想要根据条件添加特定值可能会有帮助。

尝试使用df.loc[row_index,col_indexer] = value

这是我唯一的工作!

 df.loc['C', 'x'] = 10 

在这里了解更多关于.loc 信息 。

您可以使用

df.iloc [[2],[0]] = 10

我也在寻找这个话题,我把一个方法迭代通过一个DataFrame,并用第二个DataFrame的查找值进行更新。 这是我的代码。

 src_df = pd.read_sql_query(src_sql,src_connection) for index1, row1 in src_df.iterrows(): for index, row in vertical_df.iterrows(): src_df.set_value(index=index1,col=u'etl_load_key',value=etl_load_key) if (row1[u'src_id'] == row['SRC_ID']) is True: src_df.set_value(index=index1,col=u'vertical',value=row['VERTICAL'])