Категоризация и печать информации из векторов - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в программировании, поэтому не очень разбираюсь в Python, у меня есть код, который берет информацию из файла CSV:

23;1;42.8
21;1;....

Я подумал, что информацией легче управлять в векторах, поэтому я сделал этот код:

import csv

with open("city_traffic.csv") as file_csv:
    csv_reader = csv.reader(file_csv, delimiter=';')

    cities=[]
    for line in csv_reader: 
        new_list=[]
        i=int(line[0])
        k=int(line[1])
        j=float(line[2])
        new_list.append(k)
        new_list.append(i)
        new_list.append(j)      

        cities.append(new_list)

    for s in cities:
        print("City: "+str(s[0])+ ". Total Amount of Traffic: "+str(s[2])+ ". Rush Hour: "+str(s[1]))

И результат такой:

City: 1. Total Amount of Traffic: 42.8. Rush Hour: 23
City: 1. Total Amount of Traffic: 89.1. Rush Hour: 21
City: 4. Total Amount of Traffic: 60.5. Rush Hour: 2
City: 4. Total Amount of Traffic: 50.6. Rush Hour: 10
City: 3. Total Amount of Traffico: 44.2. Rush Hour: 10

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

City: 1 Total Amount of Traffic: 131.9 Rush Hour: 21
City: 4 Total Amount of Traffic: 111.1 Rush Hour: 2
City: 3 Total Amount of Traffic: 44.2 Rush Hour: 10

Как видите У меня нет кода для этой последней части, я боролся с этой проблемой, но я был бы признателен за любые советы, как это сделать, или, возможно, улучшить свой код. Спасибо.

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Для этого следует использовать pandas. В нем много полезных функций, которые не нужно использовать for -l oop

Вначале вы можете прочитать его и добавить имена столбцов в одну строку кода (если вы не считаете import)

import pandas as pd

df = pd.read_csv('city_traffic.csv', sep=';', names=['Rush', 'City', 'Traffic'])

И вы можете его отобразить

print(df)

Результат:

   Rush  City  Traffic
0    23     1     42.8
1    21     1     89.1
2     2     4     60.5
3    10     4     50.6
4    10     3     44.2

Он также имеет функции для отображения только некоторых столбцов или строк

print(df[ df['City'] == 1 ])

Результат:

   Rush  City  Traffic
0    23     1     42.8
1    21     1     89.1

Или, если вам нужно использовать for -l oop

for index, row in df.iterrows():
    print(f"City: {row['City']}. Total Amount of Traffic: {row['Traffic']}. Rush Hour: {row['Rush']}")

Результат:

City: 1.0. Total Amount of Traffic: 42.8. Rush Hour: 23.0
City: 1.0. Total Amount of Traffic: 89.1. Rush Hour: 21.0
City: 4.0. Total Amount of Traffic: 60.5. Rush Hour: 2.0
City: 4.0. Total Amount of Traffic: 50.6. Rush Hour: 10.0
City: 3.0. Total Amount of Traffic: 44.2. Rush Hour: 10.0

Используя pandas, вы можете группировать по City и суммировать Traffic

groups = df.groupby('City')

print(groups['Traffic'].sum())

Результат:

City
1    131.9
3     44.2
4    111.1
Name: Traffic, dtype: float64

В группах для разных столбцов вы можете запускать разные функции: sum для Traffic и min для Rush

new_df = groups.agg({'Traffic': 'sum', 'Rush': 'min'})
new_df = new_df.reset_index()

print(new_df)

Результат:

   City  Traffic  Rush
0     1    131.9    21
1     3     44.2    10
2     4    111.1     2

Минимальный рабочий код.

Я использую io.StringIO в read_csv() только для имитации файла в памяти, но вы должны использовать read_csv('city_traffic.csv', ...)

text ='''23;1;42.8
21;1;89.1
2;4;60.5
10;4;50.6
10;3;44.2'''

import pandas as pd
import io

#df = pd.read_csv('city_traffic.csv', sep=';', names=['Rush', 'City', 'Traffic'])
df = pd.read_csv(io.StringIO(text), sep=';', names=['Rush', 'City', 'Traffic'])

print(df)
print('---')

print(df[ df['City'] == 1 ])
print('---')

for index, row in df.iterrows():
    print(f"City: {row['City']}. Total Amount of Traffic: {row['Traffic']}. Rush Hour: {row['Rush']}")
print('---')


groups = df.groupby('City')

print(groups['Traffic'].sum())
print('---')


new_df = groups.agg({'Traffic': 'sum', 'Rush': 'min'})
new_df = new_df.reset_index()
print(new_df)
print('---')

#new_df['City'] = new_df['City'].replace({1:'Berlin', 4:'Paris', 3:'Roma'})
new_df['City'] = ['Berlin', 'Paris', 'Roma']
print(new_df)
print('---')

for index, row in new_df.iterrows():
    print(f"City: {row['City']:6} | Total Amount of Traffic: {row['Traffic']:6.2f} | Rush Hour: {row['Rush']:2}")
print('---')

Результат:

   Rush  City  Traffic
0    23     1     42.8
1    21     1     89.1
2     2     4     60.5
3    10     4     50.6
4    10     3     44.2
---
   Rush  City  Traffic
0    23     1     42.8
1    21     1     89.1
---
City: 1.0. Total Amount of Traffic: 42.8. Rush Hour: 23.0
City: 1.0. Total Amount of Traffic: 89.1. Rush Hour: 21.0
City: 4.0. Total Amount of Traffic: 60.5. Rush Hour: 2.0
City: 4.0. Total Amount of Traffic: 50.6. Rush Hour: 10.0
City: 3.0. Total Amount of Traffic: 44.2. Rush Hour: 10.0
---
City
1    131.9
3     44.2
4    111.1
Name: Traffic, dtype: float64
---
   City  Traffic  Rush
0     1    131.9    21
1     3     44.2    10
2     4    111.1     2
---
     City  Traffic  Rush
0  Berlin    131.9    21
1   Paris     44.2    10
2    Roma    111.1     2
---
City: Berlin | Total Amount of Traffic: 131.90 | Rush Hour: 21
City: Paris  | Total Amount of Traffic:  44.20 | Rush Hour: 10
City: Roma   | Total Amount of Traffic: 111.10 | Rush Hour:  2
---
0 голосов
/ 18 июня 2020

Вы должны проверить pandas Dataframes . Они отлично подходят для работы с табличными данными. Что касается точной операции, вы хотели бы использовать grouby и применять функции, как описано в конце этого ответа .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...