Реструктурировать массив массивов и объединить те же термины - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь написать функцию, которая принимает массив массивов и реструктурирует его в другую форму с определенными условиями.Например, скажем:

array = [
    ["City1","Spanish", "163"],
    ["City1", "French", "194"],
    ["City2","English", "1239"],
    ["City2","Spanish", "1389"],
    ["City2", "French", "456"]
]

Итак, я хочу создать новый массив, который отсортирован по городам в алфавитном порядке, а столбцы - по языкам (сортировка по столбцам необязательна), любые нули будут заменены на 0. Напримери вывод в вышеупомянутый массив должен быть:

[
[0, 163, 194],
[1239, 1389, 456]
]

Я написал этот метод, но я не уверен, имеет ли он смысл логически.Он определенно жестко запрограммирован, и я пытаюсь сделать так, чтобы его можно было использовать для любого ввода в вышеуказанном формате.

import numpy as np

new_array = [[]]
x = 'City1'
y = 'City2'

def solution(arr):
    for row in arr:
        if row[0]==x:
            new_array[-1].append(row[2])
        else:
            x = x + 1
            c.append([row[2]])
solution(array)

Я знаю, что мне нужно исправить синтаксис, а также написать цикл длясортировка по алфавиту.Буду признателен за любую помощь в этом, я хотел бы понять, как перебирать массив, подобный этому, выполнять различные функции и реструктурировать массив в новый формат.

1 Ответ

0 голосов
/ 10 декабря 2018

Если производительность не является вашей главной задачей, вы можете использовать Pandas с Категориальными данными и groupby.Это работает, потому что по умолчанию groupby с категориями использует декартово произведение категорийных рядов:

import pandas as pd, numpy as np

# construct dataframe
df = pd.DataFrame(array, columns=['city', 'language', 'value'])

# convert to categories
for col in ['city', 'language']:
    df[col] = df[col].astype('category')

# groupby.first or groupby.sum works if you have unique combinations
res = df.sort_values(['city', 'language'])\
        .groupby(['city', 'language']).first().fillna(0).reset_index()

print(res)

    city language value
0  City1  English     0
1  City1   French   194
2  City1  Spanish   163
3  City2  English  1239
4  City2   French   456
5  City2  Spanish  1389

Затем для желаемого списка выводимых списков:

res_lst = res.groupby('city')['value'].apply(list).tolist()
res_lst = [list(map(int, x)) for x in res_lst]

print(res_lst)

[[0, 194, 163], [1239, 456, 1389]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...