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

2024-04-18 22:27:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我在制表符分隔的文件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'

Tags: 文件数据对象testfalsetruedataframepandas
2条回答

我认为可以使用.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

在你的队伍里

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

你不应该使用isis测试的是同一性,而不是相等性。所以当你问是否data.Frag is True时,它会比较Series对象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

相关问题 更多 >