我有一个类似这个和这个的问题。不同的是,我必须根据位置选择行,因为我不知道索引。
我想做类似df.iloc[0, 'COL_NAME'] = x
的事情,但是iloc不允许这种访问。如果我执行df.iloc[0]['COL_NAME'] = x
,就会出现关于链式索引的警告。
对于混合位置和索引,使用.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
我在这里要补充的一件事是,数据帧上的at
函数要快得多,特别是如果您正在对单个(而不是切片)值进行大量赋值。
df.at[index, 'col_name'] = x
根据我的经验,我已经得到了20倍的加速。这是一篇用西班牙语写的文章,但仍然给人一种正在发生的事情的印象。
如果你知道位置,为什么不直接从中获取索引呢?
然后使用.loc
:
df.loc[index, 'COL_NAME'] = x
另一种方法是,根据一行的索引位置为给定行分配列值,索引位置总是从0开始,最后一个索引位置是数据帧的长度:
df["COL_NAME"].iloc[0]=x
您可以使用:
df.set_value('Row_index', 'Column_name', value)
set_value
比.ix
方法快100倍。它也比使用df['Row_index']['Column_name'] = value
更好。
但是由于set_value
现在已被弃用,所以.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
修改位于"r"行(在"a "列中)和"C"列交点的单元格中的值
-
检索列"A"中行"r"的索引
i = df[ df['A']=='r' ].index.values[0]
-
修改所需列"C"中的值
df.loc[i,"C"]="newValue"
注意:之前,一定要重置行索引…有一个漂亮的索引列表!
df=df.reset_index(drop=True)
另一种方法是获取行索引,然后使用df。Loc或d .at。
# get row index 'label' from row number 'irow'
label = df.index.values[irow]
df.at[label, 'COL_NAME'] = x
扩展建训的答案,在熊猫中使用set_value
方法。
From pandas documents:
DataFrame。Set_value (index, col, value)
为列设置特定索引处的值,执行:
df.set_value(index, 'COL_NAME', x)
希望能有所帮助。