在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']
返回df
dataframe的视图,所以
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'])