在满足熊猫特定条件的地方更新行值


98

说我有以下数据框:

表

什么是更新列的值最有效的方式壮举another_feat其中编号为2

是这个吗?

for index, row in df.iterrows():
    if df1.loc[index,'stream'] == 2:
       # do something

更新: 如果我有超过100列怎么办?我不想明确命名要更新的列。我想将每列的值除以2(流列除外)。

所以要明确我的目标是:

将所有值除以具有流2的所有行的2,但不更改流列

Answers:


204

我认为loc如果需要将两列更新为相同的值,可以使用:

df1.loc[df1['stream'] == 2, ['feat','another_feat']] = 'aaaa'
print df1
   stream        feat another_feat
a       1  some_value   some_value
b       2        aaaa         aaaa
c       2        aaaa         aaaa
d       3  some_value   some_value

如果需要单独更新,请使用以下一种方法:

df1.loc[df1['stream'] == 2, 'feat'] = 10
print df1
   stream        feat another_feat
a       1  some_value   some_value
b       2          10   some_value
c       2          10   some_value
d       3  some_value   some_value

另一个常见的选择是使用numpy.where

df1['feat'] = np.where(df1['stream'] == 2, 10,20)
print df1
   stream  feat another_feat
a       1    20   some_value
b       2    10   some_value
c       2    10   some_value
d       3    20   some_value

编辑:如果您需要除stream条件之外的所有列True,请使用:

print df1
   stream  feat  another_feat
a       1     4             5
b       2     4             5
c       2     2             9
d       3     1             7

#filter columns all without stream
cols = [col for col in df1.columns if col != 'stream']
print cols
['feat', 'another_feat']

df1.loc[df1['stream'] == 2, cols ] = df1 / 2
print df1
   stream  feat  another_feat
a       1   4.0           5.0
b       2   2.0           2.5
c       2   1.0           4.5
d       3   1.0           7.0

我更新了我的问题,我有100多个专栏,我该怎么做?
Stanko,2016年

1
@Stanko-我认为这是另一个问题-您需要以100某种方式选择此列。例如,如果需要100第一列,请使用df.columns[:100],然后将其传递给loc
jezrael

我不一定需要前100列,我只想将所有列(流列除外)的值除以2,其中流为fe 2
Stanko

那么loc和np.where之间的区别是loc会更改仅满足条件的行,而np.where具有if和else语句,因此它将更改所有行?
Ambleu

1
@Ambleu-完全是。
jezrael

3

您可以使用进行相同的操作.ix,如下所示:

In [1]: df = pd.DataFrame(np.random.randn(5,4), columns=list('abcd'))

In [2]: df
Out[2]: 
          a         b         c         d
0 -0.323772  0.839542  0.173414 -1.341793
1 -1.001287  0.676910  0.465536  0.229544
2  0.963484 -0.905302 -0.435821  1.934512
3  0.266113 -0.034305 -0.110272 -0.720599
4 -0.522134 -0.913792  1.862832  0.314315

In [3]: df.ix[df.a>0, ['b','c']] = 0

In [4]: df
Out[4]: 
          a         b         c         d
0 -0.323772  0.839542  0.173414 -1.341793
1 -1.001287  0.676910  0.465536  0.229544
2  0.963484  0.000000  0.000000  1.934512
3  0.266113  0.000000  0.000000 -0.720599
4 -0.522134 -0.913792  1.862832  0.314315

编辑

在获得额外的信息之后,以下将返回所有列(满足某些条件的列)的值减半:

>> condition = df.a > 0
>> df[condition][[i for i in df.columns.values if i not in ['a']]].apply(lambda x: x/2)

我希望这有帮助!


如果我没有很多列,这是可行的,应该说我有100多个列。
Stanko,2016年

我测试了您的最后一次编辑,condition = (df.a == -1.001287)期望值将被划分为该行所在的位置,a == -1.001287但是我又得到了一个空的数据框。
Stanko

是的,这是因为这只是显示,而不是实际值,请像这样获得实际值:df.iloc[1,0]。还是最好自己设定值,然后再试一次:df.iloc[1,0] = 1.2345; condition = df.a == 1.2345
Thanos

我没有关注,为什么完全不起作用condition = (df.a == -1.001287)
Stanko,2016年

8
ix现在已弃用。
dbliss
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.