Есть ли способ объединить два списка с соответствующей информацией из переменной данных xarray? - PullRequest
1 голос
/ 27 сентября 2019

У меня есть два списка, list1 и list2.

list1 = [wind_speed_0, wind_speed_1, wind_direction_0, 
         wind_direction_1]

list2 = [serial_num_0, serial_num_1]

Элементы в этих списках на самом деле являются именами переменных данных, которые принадлежат к набору данных xarray.

По существу, еслипоследние символы в списке list2 соответствуют последним символам в списке list1, затем я хочу взять соответствующий серийный номер для каждого элемента в списке list2 и добавить его к элементам в списке list1.

Например: «abc123» - это серийный номерномер, присвоенный serial_num_0, а «abc456» - это серийный номер, присвоенный serial_num_1.Итак, я хотел бы закончить со списком3, который будет выглядеть так:

list3 = [wind_speed_abc123, wind_speed_abc456, 
        wind_direction_abc123,wind_direction_abc456]

Есть ли простой способ сделать это, что у меня в голове?

Это то, что у меня естьпока:

# Collect all possible items for lists from xarray dataset object

want_variables = ['wind_speed_.*','wind_direction_.*']
serial_nums = ['serial_num_.*']

# Give me all of the data variables found in my xarray dataset

obj_variables = list(ds.data_vars) 

# Use for loops to create list1 and list2

for var in want_variables:
    r = re.compile(var)
    list1 = list(filter(r.match, obj_variables))

    for ii in serial_nums:
        rr = re.compile(ii)
        list2 = list(filter(rr.match, obj_variables))

Это приводит меня к списку 1 и списку 2, но я не уверен, куда идти дальше.

1 Ответ

0 голосов
/ 27 сентября 2019

Я бы предложил использовать соответствующую последовательность в качестве индекса для справочного словаря, в котором каждое значение хранится под ключом (столбцом):

import pandas as pd
import re

# build the regular expression
pattern = re.compile('_([0-9]+)')

# build a lambda to use in for loop
f = lambda x: int(pattern.findall(x)[0])


ref_dict = {}

# assign all data to idx & cols:
for x in list1 + list2:
  idx = f(x)
  col = x.split('_'+str(idx))[0]
  if idx not in ref_dict.keys():
    ref_dict[idx] = {col:x}
  else:
    ref_dict[idx][col] = x

df = pd.DataFrame(ref_dict).T 

print(df)
#      serial_num    wind_direction    wind_speed
# 0  serial_num_0  wind_direction_0  wind_speed_0
# 1  serial_num_1  wind_direction_1  wind_speed_1

...