我已经创建了一个熊猫数据框架

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。

有什么建议吗?


当前回答

如果你不想改变整行的值,而只是改变一些列的值:

x = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
x.iloc[1] = dict(A=10, B=-10)

其他回答

我建议:

df.loc[index_position, "column_name"] = some_value

同时修改多个单元格:

df。loc[start_idx_pos: End_idx_pos, "column_name"] = some_value . loc[start_idx_pos: End_idx_pos, "column_name"] = some_value

苏,你的问题是将['x',C]的NaN转换为值10

答案是…

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

另一种代码是

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

我测试了,输出是df。Set_value稍微快一点,但官方方法df。At看起来是最快的非弃用的方法。

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(100, 100))

%timeit df.iat[50,50]=50 # ✓
%timeit df.at[50,50]=50 #  ✔
%timeit df.set_value(50,50,50) # will deprecate
%timeit df.iloc[50,50]=50
%timeit df.loc[50,50]=50

7.06 µs ± 118 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
5.52 µs ± 64.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
3.68 µs ± 80.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
98.7 µs ± 1.07 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
109 µs ± 1.42 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

注意,这是为单个单元格设置值。对于向量来说,loc和iloc应该是更好的选择,因为它们是向量化的。

如果想要将df的位置(0,0)中的单元格更改为'"236"76"'之类的字符串,则可以使用以下选项:

df[0][0] = '"236"76"'
# %timeit df[0][0] = '"236"76"'
# 938 µs ± 83.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

或者使用pandas.DataFrame.at

df.at[0, 0] = '"236"76"'
#  %timeit df.at[0, 0] = '"236"76"' 
#15 µs ± 2.09 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)

或者使用pandas.DataFrame.iat

df.iat[0, 0] = '"236"76"'
#  %timeit df.iat[0, 0] = '"236"76"'
# 41.1 µs ± 3.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

或者使用pandas.DataFrame.loc

df.loc[0, 0] = '"236"76"'
#  %timeit df.loc[0, 0] = '"236"76"'
# 5.21 ms ± 401 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

或者使用pandas.DataFrame.iloc

df.iloc[0, 0] = '"236"76"'
#  %timeit df.iloc[0, 0] = '"236"76"'
# 5.12 ms ± 300 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

如果时间是相关的,使用pandas.DataFrame.at是最快的方法。

使用index with condition的一种方法是首先获取满足条件的所有行的索引,然后简单地以多种方式使用这些行索引

conditional_index = df.loc[ df['col name'] <condition> ].index

示例条件如下

==5, >10 , =="Any string", >= DateTime

然后您可以以各种方式使用这些行索引,例如

替换conditional_index的一列值

df.loc[conditional_index , [col name]]= <new value>

替换conditional_index的多列值

df.loc[conditional_index, [col1,col2]]= <new value>

保存conditional_index的一个好处是,您可以将一个列的值分配给具有相同行索引的另一个列

df.loc[conditional_index, [col1,col2]]= df.loc[conditional_index,'col name']

这一切都是可能的,因为.index返回一个索引数组,.loc可以直接寻址,这样就避免了一次又一次的遍历。