我已经创建了一个熊猫数据框架
df = DataFrame(index=['A','B','C'], columns=['x','y'])
得到了这个
x y
A NaN NaN
B NaN NaN
C NaN NaN
现在,我想给特定的单元格赋值,例如给C行和x列赋值。
我希望得到这样的结果:
x y
A NaN NaN
B NaN NaN
C 10 NaN
下面的代码:
df.xs('C')['x'] = 10
但是df的内容没有改变。数据帧仍然只包含nan。
有什么建议吗?
我也在搜索这个主题,我把一种方法放在一起,通过一个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'])
RukTech的答案是df。set_value('C', 'x', 10)比我下面建议的选项快得多。然而,它已被弃用。
接下来,推荐的方法是.iat/.at。
为什么df.xs('C')['x']=10无效:
df.xs('C')在默认情况下返回一个新的数据框架,其中包含数据的副本,因此
df.xs('C')['x']=10
只修改这个新的数据帧。
Df ['x']返回Df数据框架的视图,因此
df['x']['C'] = 10
修改df本身。
警告:有时很难预测一个操作返回的是一个副本还是一个视图。出于这个原因,文档建议避免使用“链式索引”进行赋值。
所以建议的替代方案是
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