我有这张桌子:
例如:我只想更新索引为 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
但这也不成功。我该如何处理?
答案 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