首页 > 解决方案 > Python - 从CSV行+列读取返回行号

问题描述

概述

我想根据搜索返回 csv 中列的值。我大部分时间都在那里,但不明白为什么我会得到我现在的结果,以及如何解决它。我正在使用 pandas 0.25 读取 csv。由于 1.03 和 geopandas 交互的一些问题,后来选择了这个版本而不是 1.03。

问题:为什么我收到一个行号,如何从返回的结果中省略行号?

我的代码的一个子集如下:

import numpy as np
import os
import pandas as pd

code_ITS_path = 'input_ITS.csv'
code_ITS = pd.read_csv(code_ITS_path,sep=',')

for trial_name in code_ITS.Trial_Name[code_ITS.Trial_Name.str.contains("Trial")]:
   scenario_name = code_ITS.Scenario_Name[code_ITS.Trial_Name.str.contains(trial_name)]
   print("Trial Name is " + trial_name)
   print("Scenario Name is " + scenario_name)

 
 

问题

返回的结果似乎包括“场景名称是”之前的行号,不幸的是,这导致我以后出现问题。因此,打印出 trial_name 有效,但打印出 scenario_name 显示了问题。这里的问题是在scenario_name 之前存在“24”。例如:

Trial Name is 500_10_3_Trial_24
24    Scenario Name is 500_10_3_24

 
 

期望的结果

我需要返回:即,scenario_name 不包含行号和制表符缩进

Scenario Name is 500_10_3_25

 
 

示例数据

CSV 示例:

Agency,Region,Requesting_Group,Scenario_Name,Type,Scenario_Description,Trial_Name,Notes
15,Main,,500_10_3_B,Operational,Testing,500_10_3_BestEstimate,None
15,Main,,500_10_3_1,Operational,Testing,500_10_3_Trial_1,None
15,Main,,500_10_3_2,Operational,Testing,500_10_3_Trial_2,None
15,Main,,500_10_3_3,Operational,Testing,500_10_3_Trial_3,None
15,Main,,500_10_3_4,Operational,Testing,500_10_3_Trial_4,None
15,Main,,500_10_3_5,Operational,Testing,500_10_3_Trial_5,None
15,Main,,500_10_3_6,Operational,Testing,500_10_3_Trial_6,None
15,Main,,500_10_3_7,Operational,Testing,500_10_3_Trial_7,None
15,Main,,500_10_3_8,Operational,Testing,500_10_3_Trial_8,None
15,Main,,500_10_3_9,Operational,Testing,500_10_3_Trial_9,None
15,Main,,500_10_3_10,Operational,Testing,500_10_3_Trial_10,None
15,Main,,500_10_3_11,Operational,Testing,500_10_3_Trial_11,None
15,Main,,500_10_3_12,Operational,Testing,500_10_3_Trial_12,None
15,Main,,500_10_3_13,Operational,Testing,500_10_3_Trial_13,None
15,Main,,500_10_3_14,Operational,Testing,500_10_3_Trial_14,None
15,Main,,500_10_3_15,Operational,Testing,500_10_3_Trial_15,None
15,Main,,500_10_3_16,Operational,Testing,500_10_3_Trial_16,None
15,Main,,500_10_3_17,Operational,Testing,500_10_3_Trial_17,None
15,Main,,500_10_3_18,Operational,Testing,500_10_3_Trial_18,None
15,Main,,500_10_3_19,Operational,Testing,500_10_3_Trial_19,None
15,Main,,500_10_3_20,Operational,Testing,500_10_3_Trial_20,None
15,Main,,500_10_3_21,Operational,Testing,500_10_3_Trial_21,None
15,Main,,500_10_3_22,Operational,Testing,500_10_3_Trial_22,None
15,Main,,500_10_3_23,Operational,Testing,500_10_3_Trial_23,None
15,Main,,500_10_3_24,Operational,Testing,500_10_3_Trial_24,None
15,Main,,500_10_3_25,Operational,Testing,500_10_3_Trial_25,None

标签: pythonpython-3.xpandasdataframe

解决方案


scenario_name是一个系列,这就是打印索引和名称等其他内容的原因。

loc您可以使用or ,而不是获取列然后对其进行索引iloc

import pandas as pd

code_ITS = pd.read_csv("../resources/test.csv")

for trial_name in code_ITS.loc[code_ITS["Trial_Name"].str.contains("Trial"), "Trial_Name"]:
    scenario_name = code_ITS.loc[code_ITS["Trial_Name"].str.contains(trial_name), "Scenario_Name"]
    print(f"\nTrial Name is:\n{trial_name}\nScenario Name is:\n{scenario_name}")

前几行输出:

Trial Name is:
500_10_3_Trial_1
Scenario Name is:
1      500_10_3_1
10    500_10_3_10
11    500_10_3_11
12    500_10_3_12
13    500_10_3_13
14    500_10_3_14
15    500_10_3_15
16    500_10_3_16
17    500_10_3_17
18    500_10_3_18
19    500_10_3_19
Name: Scenario_Name, dtype: object

Trial Name is:
500_10_3_Trial_2
Scenario Name is:
2      500_10_3_2
20    500_10_3_20
21    500_10_3_21
22    500_10_3_22
23    500_10_3_23
24    500_10_3_24
25    500_10_3_25
Name: Scenario_Name, dtype: object

...

您可以在此处loc找到有关标准索引与标准索引之间差异的更多信息。

请注意,我使用[ ]访问列,我发现它比./attribute 样式更安全、更方便。


我认为还值得一提的是,您使用的方式Series.str.contains()可能会导致一些问题。这个例子应该有助于说明原因:

import pandas as pd

df = pd.DataFrame({"col_1": ["training", "restrain"]})

print(df, end="\n\n")

print(df.loc[df["col_1"].str.contains("train"), "col_1"])

输出:

      col_1
0  training
1  restrain

0    training
1    restrain
Name: col_1, dtype: object

您的数据遵循相当清晰的模式这一事实是一件好事,您应该能够编写一个可靠的正则表达式来代替使用。


推荐阅读