使用熊猫选择数据

时间:2015-11-23 10:22:29

标签: 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} targets after cuts".format(len(new_catalog)))

当我执行上述切割时,代码工作正常。接下来,我想再添加一个剪切:我想选择所有具有4.0 < logg < 5.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)

但是,我收到一个错误: if catalog.logg[i] == -1: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

有人可以解释一下我做错了什么以及如何解决它。谢谢

编辑1

我的数据框如下所示:

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

编辑2

 System  rp  mp  logg   FeH  FeHu  FeHl  Mstar  Mstaru  Mstarl  
0  target-01  5196     24     24  0.31  0.04  0.04  0.905   0.015   0.015   
1  target-02  5950    150    150 -0.30  0.25  0.25  0.950   0.110   0.110   
2  target-03  5598     50     50  0.04  0.05  0.05  0.997   0.049   0.049   
3  target-04  6558     44     -1  0.14  0.04  0.04  1.403   0.061   0.061   
4  target-05  6190     60     60  0.05  0.07  0.07  1.194   0.049   0.050   

....

[5 rows x 43 columns]

编辑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

但是,我正在尝试以更简单和专业的方式编写代码。我不想使用for循环。我该怎么办?

编辑4

考虑以下小例子:

System     rp   mp    logg
target-01  2    -1     2     # will NOT be selected since mp = -1
target-02  -1    3     4     # will NOT be selected since rp = -1
target-03  7     6     4.3   # will be selected since mp != -1, rp != -1, and 4 < logg <5
target-04  3.2    15    -1   # will be selected since mp != -1, rp != -1, logg = mp / rp = 15/3.2 = 4.68 (which is between 4 and 5)

1 个答案:

答案 0 :(得分:0)

而不是代码:

if catalog.logg[i] == -1:
    catalog.logg[i] = catalog.mp[i] / catalog.rp[i]

您可以使用以下内容:

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)]

完整代码:

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

我还错吗?