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

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

其他回答

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

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

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

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

.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。Loc [row_index,col_indexer] = value

我测试了,输出是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应该是更好的选择,因为它们是向量化的。

我也在搜索这个主题,我把一种方法放在一起,通过一个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'])