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