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

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。

有什么建议吗?


当前回答

如果想要将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是最快的方法。

其他回答

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

答案是…

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

另一种代码是

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

已弃用Set_value()。

从0.23.4版本开始,Pandas“宣布了未来”…

>>> df
                   Cars  Prices (U$)
0               Audi TT        120.0
1 Lamborghini Aventador        245.0
2      Chevrolet Malibu        190.0
>>> df.set_value(2, 'Prices (U$)', 240.0)
__main__:1: FutureWarning: set_value is deprecated and will be removed in a future release.
Please use .at[] or .iat[] accessors instead

                   Cars  Prices (U$)
0               Audi TT        120.0
1 Lamborghini Aventador        245.0
2      Chevrolet Malibu        240.0

考虑到这些建议,以下是如何使用它们的演示:

按行/列整数位置


>>> df.iat[1, 1] = 260.0
>>> df
                   Cars  Prices (U$)
0               Audi TT        120.0
1 Lamborghini Aventador        260.0
2      Chevrolet Malibu        240.0

通过行/列标签


>>> df.at[2, "Cars"] = "Chevrolet Corvette"
>>> df
                  Cars  Prices (U$)
0               Audi TT        120.0
1 Lamborghini Aventador        260.0
2    Chevrolet Corvette        240.0

引用:

pandas.DataFrame.iat pandas.DataFrame.at

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

你可以使用。iloc。

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

在我的例子中,我只是在选定单元格中更改它

    for index, row in result.iterrows():
        if np.isnan(row['weight']):
            result.at[index, 'weight'] = 0.0

'result'是一个带列'weight'的数据字段