替换与给定条件匹配的数据帧值

时间:2015-09-02 02:28:08

标签: python pandas

我在制表符分隔的文件test.tsv中包含以下数据。

Class   Length  Frag
I   100 True
I   200 True
P   300 False
I   400 False
P   500 True
P   600 True
N   700 True

我已将数据加载到pandas.DataFrame对象中,并且在Class = I和Frag = True的任何地方我想设置Class = F. The following code似乎不起作用。我做错了什么,我该怎么办?

import pandas
data = pandas.read_table('test.tsv')
data.loc[(data.Class == 'I') & (data.Frag is True), 'Class'] = 'F'

2 个答案:

答案 0 :(得分:3)

在你的行

data.loc[(data.Class == 'I') & (data.Frag is True), 'Class'] = 'F'

你不应该使用isis测试身份,而不是平等。因此,当您询问是否data.Frag is True时,它会比较系列对象data.Frag并询问它是否与True是同一个对象,而这不是真的。你真的想使用==,所以你得到了一个系列结果:

>>> data.Frag is True
False
>>> data.Frag == True
0     True
1     True
2    False
3    False
4     True
5     True
6     True
Name: Frag, dtype: bool

但是既然我们正在使用一系列bool,== True部分不会添加任何东西,我们可以放弃它:

>>> data.loc[(data.Class == 'I') & (data.Frag), 'Class'] = 'F'
>>> data
  Class  Length   Frag
0     F     100   True
1     F     200   True
2     P     300  False
3     I     400  False
4     P     500   True
5     P     600   True
6     N     700   True

答案 1 :(得分:1)

我认为您可以将.apply()axis=1和lambda表达式一起用于您的条件/替换。示例 -

In [24]: df['Class'] = df.apply(lambda x: 'F' if x['Class'] == 'I' and x['Frag'] == True else x['Class'], axis=1)

In [25]: df
Out[25]:
  Class  Length   Frag
0     F     100   True
1     F     200   True
2     P     300  False
3     I     400  False
4     P     500   True
5     P     600   True
6     N     700   True