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

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。

有什么建议吗?


当前回答

.iat /。是很好的解决办法。 假设你有这样一个简单的数据帧:

   A   B   C
0  1   8   4 
1  3   9   6
2  22 33  52

如果我们想修改单元格[0,"A"]的值,你可以使用这些解决方案之一:

df。Iat [0,0] = 2 df。at[0,'A'] = 2

下面是一个如何使用iat获取和设置cell值的完整示例:

def prepossessing(df):
  for index in range(0,len(df)): 
      df.iat[index,0] = df.iat[index,0] * 2
  return df

Y_train前:

    0
0   54
1   15
2   15
3   8
4   31
5   63
6   11

Y_train调用prepossession函数后,iat改变每个单元格的值乘以2:

     0
0   108
1   30
2   30
3   16
4   62
5   126
6   22

其他回答

如果想要将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可以直接寻址,这样就避免了一次又一次的遍历。

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

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

其中<some_column_name是您想要检查<条件>变量的列,<another_column_name>是您想要添加的列(可以是新列,也可以是已经存在的列)。<value_to_add>是您想要添加到该列/行中的值。

这个示例并不能精确地解决当前的问题,但是对于想要根据条件添加特定值的人来说,它可能是有用的。

建议的设置方法(根据维护人员)为:

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

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

See:

https://stackoverflow.com/a/21287235/1579844 http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-view-versus-copy https://github.com/pydata/pandas/pull/6031

从0.21.1版本开始,您还可以使用.at方法。与这里提到的.loc相比有一些不同- pandas .at与.loc,但它在单值替换上更快