我在制表符分隔的文件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'
答案 0 :(得分:3)
在你的行
data.loc[(data.Class == 'I') & (data.Frag is True), 'Class'] = 'F'
你不应该使用is
。 is
测试身份,而不是平等。因此,当您询问是否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