Создать отдельные значения кортежей для столбцов в CSV и вычислить среднее значение для 3-го столбца - PullRequest
2 голосов
/ 10 июля 2019

У меня есть набор данных:

string1 string2 rate distance 
A.      C.      1    20
A.      B       2.   30
A.      C.      2.   20

Есть несколько значений кортежей для string1 и string2. Я хочу найти разные кортежи для String1 и String2, а затем вычислить среднее значение скорости / расстояния для них. Это просто фиктивные данные, и исходные данные имеют несколько (10000) для определенного кортежа.

Пока я создал кортежи. Я не уверен, как объединить кортежи и вычислить среднее значение

def read_csv(filepath, has_header=False):
    with open(filepath, 'r') as file:
        reader = csv.reader(file)

        data = list(reader)
        header = None
        if has_header:
            header = data[0]
            data = data[1:]


    file.close()
    return data, header

if __name__ == '__main__':

    outfilepath = "data/outfile12.csv"

    outdata = []

    codes, header = read_csv("data/sample.csv", has_header=TRUE)

    # create dictionary
    codes_dict = {

}
        for code in codes:
            codes_dict[(code[0], code[1])]

        for row in codes : 

        #Write logic here

Вывод должен выглядеть так:

string1 string2 column 
    A      C      0.003    
    A      B     0.00030
    B      A    0.000020

Может ли кто-нибудь помочь с тем же.

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Вот, пожалуйста:

= ^ .. ^ =

import pandas as pd
from io import StringIO

# create raw data
raw_data = StringIO("""
string1 string2 rate distance
A. C. 1 20
A. B 2. 30
A. C. 2. 20""")

# load data into data frame
df = pd.read_csv(raw_data, sep=' ')
# calculate divide
df['divide'] = df['rate'] / df['distance']
# drop not needed columns
df = df.drop(columns=['rate','distance'])
# grop by columns and sum values
result = df.groupby(['string1', 'string2']).mean()

Выход:

string1 string2          
A.      B        0.066667
        C.       0.075000
1 голос
/ 10 июля 2019

Вам следует использовать pandas для этих задач.Google документирует себя для конкретных случаев (строки без заголовков в CSV-файле), я приведу простой пример:

import pandas as pd

Сначала вы загружаете CSV, и это действительно зависит от его формата, поэтому может потребоваться изменить разделитель,Я взял форматирование csv из ваших примеров данных (несколько пробелов):

dataframe = pd.read_csv(filepath, sep='\s+')

Затем вы группируете данные по набору столбцов:

groupby = dataframe.groupby(['string1','string2'])
print(groupby.groups) 

, который возвращает объект «DataFrameGroupBy», которыйпо сути, это список (кортеж значений столбцов, фрейм данных, соответствующих этим данным) в оболочке.

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

def add_average_velocity(input_rows):
    input_rows['avg_velocity'] = (input_rows['rate']/input_rows['distance']).mean()
    return input_rows

new_dataframe = dataframe.groupby(['string1','string2']).apply(add_average_velocity).reset_index()
print(new_dataframe)

Или, если вы хотите полностью избавиться от всех старых данных и сохранить только новые:

def add_average_velocity(input_rows):
    output_data = pd.Series({'velocity':(input_rows['rate']/input_rows['distance']).mean()})
    # you can skip making a pd.Series objects if you are okay with having the data unnamed in resulting dataframe. You can always rename columns later anyway.
    return output_data

new_dataframe = dataframe.groupby(['string1','string2']).apply(add_average_velocity).reset_index()
print(new_dataframe)
...