使用iloc设置pandas DataFrame中特定单元格的值

时间:2015-07-22 16:52:44

标签: python pandas

我的问题类似于thisthis。区别在于我必须逐个选择,因为我不知道索引。

我想做df.iloc[0, 'COL_NAME'] = x之类的事情,但是iloc不允许这种访问。如果我df.iloc[0]['COL_NAME] = x,则会出现关于链式索引的警告。

8 个答案:

答案 0 :(得分:57)

对于混合位置和索引,请使用.ix。但是你需要确保你的索引不是整数,否则会引起混淆。

df.ix[0, 'COL_NAME'] = x

更新

或者,尝试

df.iloc[0, df.columns.get_loc('COL_NAME')] = x

示例:

import pandas as pd
import numpy as np

# your data
# ========================
np.random.seed(0)
df = pd.DataFrame(np.random.randn(10, 2), columns=['col1', 'col2'], index=np.random.randint(1,100,10)).sort_index()

print(df)


      col1    col2
10  1.7641  0.4002
24  0.1440  1.4543
29  0.3131 -0.8541
32  0.9501 -0.1514
33  1.8676 -0.9773
36  0.7610  0.1217
56  1.4941 -0.2052
58  0.9787  2.2409
75 -0.1032  0.4106
76  0.4439  0.3337

# .iloc with get_loc
# ===================================
df.iloc[0, df.columns.get_loc('col2')] = 100

df

      col1      col2
10  1.7641  100.0000
24  0.1440    1.4543
29  0.3131   -0.8541
32  0.9501   -0.1514
33  1.8676   -0.9773
36  0.7610    0.1217
56  1.4941   -0.2052
58  0.9787    2.2409
75 -0.1032    0.4106
76  0.4439    0.3337

答案 1 :(得分:14)

我在这里要补充的一点是,数据帧上的at函数要快得多,特别是如果您要对单个(非切片)值进行大量赋值。

df.at[index, 'col_name'] = x

根据我的经验,我获得了20倍的加速。 Here是一篇西班牙语的写作,但仍然给人留下了什么样的印象。

答案 2 :(得分:7)

如果您知道这个位置,为什么不从中获取索引?

然后使用.loc:

df.loc[index, 'COL_NAME'] = x

答案 3 :(得分:5)

您可以使用:

df.set_value('Row_index', 'Column_name', value)

set_valye.ix方法快100倍。然后最好使用df['Row_index']['Column_name'] = value

但是由于set_value现在是deprecated,所以.iat / .at是很好的替代品。

例如,如果我们有此data_frame

   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

答案 4 :(得分:2)

另一种方法是获取行索引,然后使用df.loc或df.at.

# get row index 'label' from row number 'irow'
label = df.index.values[irow] 
df.at[label, 'COL_NAME'] = x

答案 5 :(得分:2)

修改行“ r”(在“ A”列中)和“ C”列相交处的单元格中的值

  1. 获取“ A”列中“ r”行的索引

        i = df[ df['A']=='r' ].index.values[0]
    
  2. 修改所需列“ C”中的值

        df.loc[i,"C"]="newValue"
    

注意:在此之前,请务必重置行的索引...以拥有一个不错的索引列表!

        df=df.reset_index(drop=True)

答案 6 :(得分:1)

另一种方法是:

df["COL_NAME"].iloc[0]=x

答案 7 :(得分:0)

Extending Jianxun's answer, using set_value mehtod in pandas. It sets value for a column at given index.

From pandas documentations:

DataFrame.set_value(index, col, value)

To set value at particular index for a column, do:

df.set_value(index, 'COL_NAME', x)

Hope it helps.