更改具有特定索引

时间:2016-05-02 09:04:52

标签: python pandas

我有这张桌子:

table

例如:我只想更新索引为 a 的行的值(除外)。

我尝试过的事情:

index = 'a'
cols = [col for col in df.columns if col != 'stream']
df.loc[index,cols] = df * some_value

这给了我错误: ValueError:与DataFrame不兼容的索引器

然后我尝试了:

index = 'a'
df.loc[index] = df * some_value

但是我也给了我同样的错误。

最后我也试过了:

df.index.name = 'foo'
cols = [col for col in df.columns if col != 'stream']
df.loc[df['foo'] == 'a', cols ] = df * some_value

但这也不成功。我该如何处理?

2 个答案:

答案 0 :(得分:2)

听起来像你想要the .loc operator

In [3]: df
Out[3]: 
   stream  feat  another_feat
a       1     1             4
b       2     2             5
c       2     5             1
d       3     3             4

In [4]: df.loc['a', 'feat'] = 'foobar'

In [5]: df
Out[5]: 
   stream    feat  another_feat
a       1  foobar             4
b       2       2             5
c       2       5             1
d       3       3             4

它也适用于多列

In [6]: df.loc['a', ['feat', 'another_feat']] = ['foo', 'bar']

In [7]: df
Out[7]: 
   stream feat another_feat
a       1  foo          bar
b       2    2            5
c       2    5            1
d       3    3            4

排除“所有列,但'蒸汽'列”可以通过以下方式轻松完成:

columns = list(df.columns)
columns.remove('steam')

在我看来,这比单线列表功能更清晰明了。

  

可读性很重要    - Python的禅宗

答案 1 :(得分:2)

我认为您需要添加[]

index = ['a']
cols = [col for col in df.columns if col != 'stream']

df.loc[index, cols] = df * some_value

样品:

print df
   stream  feat  another_feat
a       1     1             4
b       2     2             5
c       2     5             1
d       3     3             4

some_value = 5

index = ['a']
cols = [col for col in df.columns if col != 'stream']

df.loc[index,cols] = df * some_value
print df
   stream  feat  another_feat
a       1     5            20
b       2     2             5
c       2     5             1
d       3     3             4

它有效,因为它返回DataFrame(感谢ayhan):

print df.loc[['a'],cols]
   feat  another_feat
a     1             4

print df.loc['a',cols]
feat            1
another_feat    4
Name: a, dtype: int64

编辑:另一种解决方案:

cols = [col for col in df.columns if col != 'stream']

df.loc['a',cols] = df.loc['a',cols] * some_value
print df
   stream  feat  another_feat
a       1     5            20
b       2     2             5
c       2     5             1
d       3     3             4