我创建了一个熊猫数据框架
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的内容没有改变。同样,数据帧中只有EDOCX1[1]。
有什么建议吗?
不要使用"链接索引"(df['x']['C']),使用df.ix['x','C']。
索引访问的顺序需要是:dataframe[column (series)] [row (Series index)],而许多人(包括我自己)更习惯于dataframe[row][column]的顺序。作为一个Matlab和R程序员,后者对我来说更直观,但显然不是熊猫的工作方式。
我试过了,但最后添加了另一个行名x和另一个列名c。您必须先添加行,然后再添加列。所以df.ix['c','x']=10
致@yariv评论。警告:从0.20.0开始,.ix索引器已被弃用,取而代之的是更严格的.iloc和.loc索引器。/pandas docs/stable/generated/…。df.at看起来像是在到处乱窜。
ruktech的回答是,df.set_value('C', 'x', 10)走的速度,远比我建议下面的选项。然而,它已被slated for deprecation。
什么是.iat/.at前锋,和方法。
为什么不工作:df.xs('C')['x']=10
df.xs('C')默认,返回一个新的下列复制数据,从而
df.xs('C')['x']=10
这个新的修改下列只读。
df['x']归来df下列A视图等
df['x']['C'] = 10
df本身的修改。
警告:这是很难预测,如果在A或A拷贝操作返回的视图。这是一个原因,是分配上的文档"链式索引"。
因此,建议的替代。
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
API中没有df.x这样的东西。你什么意思?
什么版本的熊猫?
@smci:'x'是df中一列的名称。df.x返回一个Series,值在x列中。我将把它改为df['x'],因为这个符号可以与任何列名一起使用(与点符号不同),我认为它更清晰。
我知道,我以为你是在说df.x是df.xs, df.ix旁边的一种未知的新方法。
df.xs(..., copy=True)返回一个副本,这是默认行为。df.xs(..., copy=False)返回原件。
根据维护人员的说法,这不是设置值的推荐方法。请参阅/a/21287235/1579844和我的答案。
关于ix和loc的一些问题,熊猫的文档可能更清晰。
有时,如果您有一个像datetime这样的大索引列,那么链接会很痛苦。你不能每次都打。
确实应该使用更好的名称,使用x和C可能会令人困惑
在我的例子中,我混合了索引位置和列标签。我找到了让它工作的方法:df_temp.iat[0, df_temp.columns.get_loc('Cash')] = df_temp['Cash'].iloc[0] + start_val。
更新:.set _价值法是要被取消。.iat /特别是好的文档提供replacements,不幸的小熊猫
这样做是最快的方式使用_值集。本方法是更快的方法比.ix~100倍。例如:
df.set_value('C', 'x', 10)
它甚至比df['x']['C'] = 10更好。
1000个循环,每个循环最好3:195&181;s"df['x'][c']=10"1000个循环,每个循环最好3:310&181;s"df.ix['c','x']=10"1000个循环,每个循环最好3:189&181;s"df.x s('c',copy=false)['x']=10"1000个循环,每个循环最好3:7.22&181;s"df.set value('c','x',10)"
这是否也适用于向数据帧添加新行/列?
是的(熊猫0.16.2)
是否可以使用该选项将值设置为df=df.append(df.sum(numeric_only=True),ignore_index=True)?
所以,你可以使用一个查找.loc湖泊在使用条件:
df.loc[df[] == , []] =
哪里是你想柱变量对检查和是你想要添加到柱(柱可以新的或已经存在的那一个)。是你想要添加的价值在那一列/行。
本例子是一个不精确的问题在手的工作,但它可能是有用的为人,想添加一个特定的值基于一种状态。
第二列需要在括号中,否则所有列都将被值覆盖。像这样:df.loc[df['age']==3, ['age-group']] = 'toddler'。
谢谢@piizei!
单(根据演练和维护)集A的值是:
df.ix['x','C']=10
使用链式索引(df['x']['C'])可能导致问题。
湖:
http:/ / / / / 21287235 1579844
http:// /熊猫/ dev / indexing.html #文档的索引视图和拷贝
http:/ / / /熊猫/拉 pydata 6031号
不推荐使用ix:pandas docs.github.io/pandas docs travis/…
尝试使用df.loc[row_index,col_indexer] = value
欢迎使用堆栈溢出!请考虑编辑您的文章,以添加更多关于您的代码所做的以及它将解决问题的原因的解释。一个大部分只包含代码的答案(即使它有效)通常不会帮助操作人员理解他们的问题。如果只是一个猜测,建议你不要发布答案。一个好的答案将有一个合理的理由来解释为什么它可以解决OP的问题。
这是唯一的东西为我工作!
df.loc['C', 'x'] = 10
了解更多关于.loc这里。
.loc是否取代了.iat/.at?
at与loc相似,两者都提供基于标签的查找。如果只需要获取或设置数据帧或序列中的单个值,请使用at。从帕达斯博士
很好,当我的索引元素是数值时,这对我很有用。
这对数字索引和字符串索引的组合不起作用。
在我的例子,我选择改变它在细胞
for index, row in result.iterrows():
if np.isnan(row['weight']):
result.at[index, 'weight'] = 0.0
结果是一个"量"列的DataField
你可以使用.iloc。
df.iloc[[2], [0]] = 10
此方法似乎不支持多个值,例如df.iloc[[2:8], [0]] = [2,3,4,5,6,7],而方法df.loc()本身支持这些值。
set_value()是过时的。
从释放的0.23.4"熊猫","未来"……
>>> 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
df.loc['c','x']=10本想和CTH变化值。xth柱。
除了上面的答案,这是一个基准比较不同的方式添加到已存在的数据行下列。它的显示是使用AT或设定值是最有效的方式(至少dataframes大型论文试验条件)。
创建新的下列for each row和……
……附加信息(13)
……串联式(13.1)IT
在另一个容器商店的所有新的行,第一,转换到新添加一次和下列…
容器列表的列表(S)= 2.0)
集装箱的词典列表(S = 1.9)
新的全iterate过下列预分配,和所有的列和行填充使用
……在(0.6)
……集值(0.4)_
现有的测试,包括下列的行和列和1000万NumPy是用随机值。这是添加新的行下列100。
湖下面的代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Nov 21 16:38:46
@author: gebbissimo
"""
import pandas as pd
import numpy as np
import time
NUM_ROWS = 100000
NUM_COLS = 1000
data = np.random.rand(NUM_ROWS,NUM_COLS)
df = pd.DataFrame(data)
NUM_ROWS_NEW = 100
data_tot = np.random.rand(NUM_ROWS + NUM_ROWS_NEW,NUM_COLS)
df_tot = pd.DataFrame(data_tot)
DATA_NEW = np.random.rand(1,NUM_COLS)
#%% FUNCTIONS
# create and append
def create_and_append(df):
for i in range(NUM_ROWS_NEW):
df_new = pd.DataFrame(DATA_NEW)
df = df.append(df_new)
return df
# create and concatenate
def create_and_concat(df):
for i in range(NUM_ROWS_NEW):
df_new = pd.DataFrame(DATA_NEW)
df = pd.concat((df, df_new))
return df
# store as dict and
def store_as_list(df):
lst = [[] for i in range(NUM_ROWS_NEW)]
for i in range(NUM_ROWS_NEW):
for j in range(NUM_COLS):
lst[i].append(DATA_NEW[0,j])
df_new = pd.DataFrame(lst)
df_tot = df.append(df_new)
return df_tot
# store as dict and
def store_as_dict(df):
dct = {}
for j in range(NUM_COLS):
dct[j] = []
for i in range(NUM_ROWS_NEW):
dct[j].append(DATA_NEW[0,j])
df_new = pd.DataFrame(dct)
df_tot = df.append(df_new)
return df_tot
# preallocate and fill using .at
def fill_using_at(df):
for i in range(NUM_ROWS_NEW):
for j in range(NUM_COLS):
#print("i,j={},{}".format(i,j))
df.at[NUM_ROWS+i,j] = DATA_NEW[0,j]
return df
# preallocate and fill using .at
def fill_using_set(df):
for i in range(NUM_ROWS_NEW):
for j in range(NUM_COLS):
#print("i,j={},{}".format(i,j))
df.set_value(NUM_ROWS+i,j,DATA_NEW[0,j])
return df
#%% TESTS
t0 = time.time()
create_and_append(df)
t1 = time.time()
print('Needed {} seconds'.format(t1-t0))
t0 = time.time()
create_and_concat(df)
t1 = time.time()
print('Needed {} seconds'.format(t1-t0))
t0 = time.time()
store_as_list(df)
t1 = time.time()
print('Needed {} seconds'.format(t1-t0))
t0 = time.time()
store_as_dict(df)
t1 = time.time()
print('Needed {} seconds'.format(t1-t0))
t0 = time.time()
fill_using_at(df_tot)
t1 = time.time()
print('Needed {} seconds'.format(t1-t0))
t0 = time.time()
fill_using_set(df_tot)
t1 = time.time()
print('Needed {} seconds'.format(t1-t0))
以下是所有用户为按整数和字符串索引的数据帧提供的有效解决方案的摘要。
df.iloc、df.loc和df。对于这两种数据帧类型,df.iloc仅适用于行/列整数索引,df.loc和df.at支持使用列名称和/或整数索引设置值。
当指定的索引不存在时,df.loc和df.at都会将新插入的行/列追加到现有的数据帧,但df.iloc会引发"indexerror:位置索引器超出界限"。在Python2.7和3.7中测试的一个工作示例如下:
import numpy as np, pandas as pd
df1 = pd.DataFrame(index=np.arange(3), columns=['x','y','z'])
df1['x'] = ['A','B','C']
df1.at[2,'y'] = 400
# rows/columns specified does not exist, appends new rows/columns to existing data frame
df1.at['D','w'] = 9000
df1.loc['E','q'] = 499
# using df[] == to retrieve target rows
df1.at[df1['x']=='B', 'y'] = 10000
df1.loc[df1['x']=='B', ['z','w']] = 10000
# using a list of index to setup values
df1.iloc[[1,2,4], 2] = 9999
df1.loc[[0,'D','E'],'w'] = 7500
df1.at[[0,2,"D"],'x'] = 10
df1.at[:, ['y', 'w']] = 8000
df1
>>> df1
x y z w q
0 10 8000 NaN 8000 NaN
1 B 8000 9999 8000 NaN
2 10 8000 9999 8000 NaN
D 10 8000 NaN 8000 NaN
E NaN 8000 9999 8000 499.0
.iat/.at是很好的解决方案。假设你有这个简单的数据框架:
A B C
0 1 8 4
1 3 9 6
2 22 33 52
如果我们想修改单元格的值,[0,"A"]u可以使用这些解决方案之一:
df.iat[0,0] = 2
df.at[0,'A'] = 2
下面是一个完整的例子,如何使用iat来获取和设置单元格的值:
def prepossessing(df):
for index in range(0,len(df)):
df.iat[index,0] = df.iat[index,0] * 2
return df
Y_培训时间:
0
0 54
1 15
2 15
3 8
4 31
5 63
6 11
在调用了iat要更改以使每个单元格的值乘以2的前置函数后进行y训练:
0
0 108
1 30
2 30
3 16
4 62
5 126
6 22
所以,你可以从0.21.1 .at版使用方法。有一些差异,相比.locAS与.loc熊猫。在这里,但它具有单值替换
如果你想更改的值不完整的行,但只有一些列:
x = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
x.iloc[1] = dict(A=10, B=-10)
我认为这是寻找一个主题,我把一iterate通过下列方式和更新它的查找值从第二下列。这里是我的代码。
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'])