Python 使用熊猫选择数据

Python 使用熊猫选择数据,python,pandas,Python,Pandas,我有一个大目录,我根据以下标准从中选择数据: columns = ["System", "rp", "mp", "logg"] catalog = pd.read_csv('data.txt', skiprows=1, sep ='\s+', names=columns) # CUTS i = (catalog.rp != -1) & (catalog.mp != -1) new_catalog = pd.DataFrame(catalog[i]) print("{0} target

我有一个大目录,我根据以下标准从中选择数据:

columns = ["System", "rp", "mp", "logg"]
catalog = pd.read_csv('data.txt', skiprows=1, sep ='\s+', names=columns)

# CUTS
i = (catalog.rp != -1) & (catalog.mp != -1)

new_catalog = pd.DataFrame(catalog[i])
print("{0} targets after cuts".format(len(new_catalog)))
当我执行上述剪切时,代码运行良好。接下来,我想再添加一个剪切:我想选择所有具有
4.0
的目标。但是,一些目标具有
logg=-1
(表示该值不可用)。幸运的是,我可以从其他可用参数计算
logg
。下面是我的最新剪辑:

# CUTS
i = (catalog.rp != -1) & (catalog.mp != -1)
if catalog.logg[i] == -1:
    catalog.logg[i] = catalog.mp[i] / catalog.rp[i]
i &= (4 <= catalog.logg) & (catalog.logg <= 5)
编辑2 编辑3 我理解的格式代码应为:

for row in range(len(catalog)):
    parameter = catalog['logg'][row]
    if parameter == -1:
        parameter = catalog['mp'][row] / catalog['rp'][row]
    if parameter > 4.0 and parameter < 5.0:
        # select this row for further analysis

之所以会出现错误,是因为catalog.logg[i]不是一个标量,而是一个系列,所以应该转向矢量化操作:

catalog.loc[i,'logg'] = catalog.loc[i,'mp']/catalog.loc[i,'rp']
这将修改原地的logg列

至于编辑3:

rows=catalog.loc[(catalog.logg > 4) & (catalog.logg < 5)]
rows=catalog.loc[(catalog.logg>4)和(catalog.logg<5)]
它将选择满足条件的行,而不是该代码:

if catalog.logg[i] == -1:
    catalog.logg[i] = catalog.mp[i] / catalog.rp[i]
您可以使用以下选项:

Data columns:
System           477  non-null values
rp               477  non-null values
mp               477  non-null values
logg             477  non-null values
dtypes: float64(37), int64(3), object(3)None
i &= df.logg == -1
df.loc[i, 'logg'] = df.loc[i, 'mp'] / df.loc[i, 'rp']
# or
df.ix[i, 'logg'] = df.ix[i, 'mp'] / df.ix[i, 'rp']
对于编辑3,您需要添加该行:

your_rows = df[(df.logg > 4) & (df.logg < 5)]
your_rows=df[(df.logg>4)和(df.logg<5)]
完整代码:

i = (catalog.rp != -1) & (catalog.mp != -1)
i &= df.logg == -1
df.ix[i, 'logg'] = df.ix[i, 'mp'] / df.ix[i, 'rp']
your_rows = df[(df.logg > 4) & (df.logg < 5)]
i=(catalog.rp!=-1)和(catalog.mp!=-1)
i&=df.logg==-1
df.ix[i,'logg']=df.ix[i,'mp']/df.ix[i,'rp']
您的行=df[(df.logg>4)和(df.logg<5)]
编辑

也许我仍然不明白您想要什么,但我得到了您想要的输出:

import pandas as pd
from io import StringIO

data = """
System     rp   mp    logg
target-01  2    -1     2     
target-02  -1    3     4     
target-03  7     6     4.3   
target-04  3.2    15    -1   
"""

catalog = pd.read_csv(StringIO(data), sep='\s+')
i = (catalog.rp != -1) & (catalog.mp != -1)
i &= catalog.logg == -1
catalog.ix[i, 'logg'] = catalog.ix[i, 'mp'] / catalog.ix[i, 'rp']
your_rows = catalog[(catalog.logg > 4) & (catalog.logg < 5)]

In [7]: your_rows
Out[7]:
  System   rp  mp    logg
2  target-03  7.0   6  4.3000
3  target-04  3.2  15  4.6875
将熊猫作为pd导入
从io导入StringIO
data=”“”
系统rp mp日志
目标-01 2-1 2
目标-02-1 3 4
目标-03 7 6 4.3
目标-04 3.2 15-1
"""
catalog=pd.read_csv(StringIO(数据),sep='\s+'))
i=(catalog.rp!=-1)和(catalog.mp!=-1)
i&=catalog.logg==-1
catalog.ix[i,'logg']=catalog.ix[i,'mp']/catalog.ix[i,'rp']
您的行=目录[(catalog.logg>4)和(catalog.logg<5)]
在[7]:您的_行
出[7]:
系统rp mp日志
2目标-037.064.3000
3目标-04 3.2 15 4.6875

我还是错了吗?

你能展示一下你的数据框是什么样子吗?@Antonprotopov,我编辑了这个问题。请检查一下。我的
df
比我发布的列多。为了简单起见,我删除了它们。顺便问一下,什么是
mp[I]
rp[I]
?它应该是
catalog.mp[i]
catalog.rp[i]
?是的,你是对的!但错误依然存在@AntonProtopopovAIU您附加了
描述
输出,但您能显示实际数据吗?像
df.head(10)
?错误来自
for
循环。我还尝试了
if catalog.loc[I,'logg']==-1:
现在我得到的错误是
AttributeError:'DataFrame'对象没有属性'loc'
在我的情况下同样的代码也可以工作。loc是用于切片熊猫数据帧,
catalog.loc[I,'logg']=-1仍然是一个系列,所以你仍然会得到模糊的真值错误,你应该一个接一个地遍历这个系列,或者使用向量化运算。你能给我更多的细节吗?我是
pandas
新手,我不想对
循环使用
catalog.loc[I,'logg']
将返回logg列的子序列,条件
I
为真,因此您可以通过将相应的子序列
mp
除以
rp
来直接修改此序列,
/
进入系列只会进行元素划分,我理解,但我不知道如何实现它。您是如何修复
for
循环的
的?它不工作。在您提供的
full code
中,脚本将选择具有
logg=-1
的所有目标。那不是我想要的所以我不明白你想要什么。。AFAIU您需要选择所有
(catalog.rp!=-1)和(catalog.mp!=-1)
然后将
df.logg==-1
中的所有行替换为
df.ix[i,'mp']/df.ix[i,'rp']
,然后从修改的
df
中选择所有行,其中
(df.logg>4)和(df.logg<5)
。你到底想要什么?我想要的是:首先,我选择所有
(catalog.rp!=-1)&(catalog.mp!=-1)。其次,如果
catalog.logg==-1
,则将
-1`替换为
catalog.mp/catalog.rp
。第三,选择所有条目(来自新修改的和原始的df),其中
(catalog.logg>4)和(catalog.logg<5)
。谢谢你的耐心。
i = (catalog.rp != -1) & (catalog.mp != -1)
i &= df.logg == -1
df.ix[i, 'logg'] = df.ix[i, 'mp'] / df.ix[i, 'rp']
your_rows = df[(df.logg > 4) & (df.logg < 5)]
import pandas as pd
from io import StringIO

data = """
System     rp   mp    logg
target-01  2    -1     2     
target-02  -1    3     4     
target-03  7     6     4.3   
target-04  3.2    15    -1   
"""

catalog = pd.read_csv(StringIO(data), sep='\s+')
i = (catalog.rp != -1) & (catalog.mp != -1)
i &= catalog.logg == -1
catalog.ix[i, 'logg'] = catalog.ix[i, 'mp'] / catalog.ix[i, 'rp']
your_rows = catalog[(catalog.logg > 4) & (catalog.logg < 5)]

In [7]: your_rows
Out[7]:
  System   rp  mp    logg
2  target-03  7.0   6  4.3000
3  target-04  3.2  15  4.6875