Python - чтение из строки CSV + столбец возвращает номера строк - PullRequest
0 голосов
/ 09 апреля 2020

Обзор

Я хотел бы вернуть значение столбца в CSV на основе поиска. Я почти весь путь, но не понимаю, почему я получаю результат, и как это исправить. Я использую pandas 0,25 для чтения в CSV. Эта версия была выбрана вместо 1.03 из-за некоторых проблем с 1.03 и взаимодействием geo pandas позже.

Вопрос: Почему я получаю номер строки, как мне опустить номер строки в возвращенном результате ?

Подмножество моего кода выглядит следующим образом:

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)


Проблема

Возвращаемые результаты, кажется, включают номер строки перед "Scenario Name is" К сожалению, это вызывает у меня проблемы позже. Итак, распечатка триал-имени работает, но распечатка имя-сценария показывает проблему. Проблема здесь заключается в наличии «24» перед имя_сценария. Например:

Trial Name is 500_10_3_Trial_24
24    Scenario Name is 500_10_3_24


Желаемый результат

Что мне нужно вернуть: Ie, имя_сценария не содержит номер строки и отступ табуляции

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

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

scenario_name - это серия, поэтому печатаются другие вещи, такие как индекс и имя.

Вместо того, чтобы получить столбец и затем проиндексировать его, вы можете просто использовать loc или 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 и стандартным индексированием можно найти здесь .

Обратите внимание, что я использую [ ] для доступа к столбцам, я считаю, что это намного безопаснее и удобнее, чем стиль атрибута . /.


Думаю, стоит упомянуть, что То, как вы используете 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

Тот факт, что ваши данные следуют довольно четкому шаблону, является замечательной вещью, вы должны иметь возможность написать solid регулярное выражение для использования вместо

0 голосов
/ 09 апреля 2020

Проблема в том, что code_ITS.Scenario_Name[code_ITS.Trial_Name.str.contains(trial_name)] возвращает серию, поэтому при печати также отображается номер строки Если вы хотите сбросить номер строки, вы можете добавить .values, т.е.

code_ITS.Scenario_Name[code_ITS.Trial_Name.str.contains(trial_name)].values

, который возвращает массив numpy., Поэтому номер строки не будет отображаться. Вывод будет выглядеть так:

Trial Name is 500_10_3_Trial_1
['Scenario Name is 500_10_3_1']
Trial Name is 500_10_3_Trial_2
['Scenario Name is 500_10_3_2']
Trial Name is 500_10_3_Trial_3
['Scenario Name is 500_10_3_3']
Trial Name is 500_10_3_Trial_4
['Scenario Name is 500_10_3_4']
Trial Name is 500_10_3_Trial_5
['Scenario Name is 500_10_3_5']
Trial Name is 500_10_3_Trial_6
['Scenario Name is 500_10_3_6']
Trial Name is 500_10_3_Trial_7
['Scenario Name is 500_10_3_7']

, если вы хотите избавиться от скобок, добавьте [0] в конце. Вам нужно быть немного осторожнее, так как в итоге вы можете получить пустой массив, поэтому вам нужно будет также проверить его.

Следующий код

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")]:
    try:
        scenario_name = code_ITS.Scenario_Name[code_ITS.Trial_Name.str.contains(trial_name)].values[0]
        print("Trial Name is " + trial_name)
        print("Scenario Name is " + scenario_name)
    except Exception as e:
        print(e)

дает вывод:

Trial Name is 500_10_3_Trial_1
Scenario Name is 500_10_3_1
Trial Name is 500_10_3_Trial_2
Scenario Name is 500_10_3_2
Trial Name is 500_10_3_Trial_3
Scenario Name is 500_10_3_3
Trial Name is 500_10_3_Trial_4
Scenario Name is 500_10_3_4
Trial Name is 500_10_3_Trial_5
Scenario Name is 500_10_3_5
Trial Name is 500_10_3_Trial_6
Scenario Name is 500_10_3_6
Trial Name is 500_10_3_Trial_7
Scenario Name is 500_10_3_7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...