Выберите столбцы для объединения в цикле файлов с различным количеством столбцов - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть словарь:

#file1 mentions 2 columns while file2 mentions 3
dict2 = ({'file1' : ['colA', 'colB'],'file2' : ['colY','colS','colX'], etc..})

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

Столбцы не будут иметь одинаковые имена для каждого файла, и очень сложно автоматизировать такой настраиваемый процесс. Что ты думаешь?

Я хочу сделать объединение упомянутых столбцов в новом столбце для каждого файла. Это должно быть автоматизировано.

for k, v in dict1.items():
    df = pd.DataFrame.from_records(data=arcpy.da.SearchCursor(k, v)) #reads to a df
    df['new'] = df.astype(str).apply(' '.join, axis=1)#concatenation

Как я могу заставить это работать каждый раз, независимо от количества столбцов в каждом словаре?

Пример:

a = {'colA' : [123,124,112,165],'colB' :['alpha','beta','gamma','delta']}
file1 = pd.DataFrame(data = a)
file1

colA   colB
123    alpha
124    beta
112    gamma
165    delta

b = {'colY' : [123,124,112,165],'colS' :['alpha','beta','gamma','delta'], 'colX' :[323,326,378,399] }
file2 = pd.DataFrame(data = b)
file2

colY  colS      colX 
123   alpha     323
124   beta      326
112   gamma     378
165   delta     399

Результат:

file1

col_all
123 alpha
124 beta
112 gamma
165 delta

file2

call_all
123 alpha 323
124 beta  326
112 gamma 378
165 delta 399

Примечание

Например,

file2 может иметь еще 5 столбцов, но только 3 следует объединить в один столбец. Как сделать начальный диктат, который бы определял, какие столбцы будут объединяться и что там просто существовать, без изменений.

1 Ответ

0 голосов
/ 05 ноября 2018

Таким образом, вы должны выбрать имена столбцов для конкат, например, первые 3 столбца, выбранные по позициям:

for k, v in dict1.items():
    df = pd.DataFrame.from_records(data=arcpy.da.SearchCursor(k, v)) #reads to a df
    df['new'] = df.iloc[:, :3].astype(str).apply(' '.join, axis=1)#concatenation

Если создать список возможных имен столбцов, используйте intersection:

for k, v in dict1.items():
    df = pd.DataFrame.from_records(data=arcpy.da.SearchCursor(k, v)) #reads to a df
    L = ['colA','colB','colS']
    cols = df.columns.intersection(L)
    df['new'] = df[cols].astype(str).apply(' '.join, axis=1)#concatenation

Или фильтрация:

for k, v in dict1.items():
    df = pd.DataFrame.from_records(data=arcpy.da.SearchCursor(k, v)) #reads to a df
    L = ['colA','colB','colS']
    mask = df.columns.isin(L)
    df['new'] = df.loc[:, mask].astype(str).apply(' '.join, axis=1)#concatenation

EDIT:

Если вы хотите создать другую структуру данных с другим списком имен необходимых столбцов, возможное решение - создать список кортежей:

L = [('file1', ['colA', 'colB'], ['colA','colB']), 
     ('file2', ['colY','colS','colX'], ['colY','colS'])]

for i, j, k in L:
    print (i)
    print (j)
    print (k)

file1
['colA', 'colB']
['colA', 'colB']
file2
['colY', 'colS', 'colX']
['colY', 'colS']

Итак, ваше решение должно быть переписано:

for i, j, k in L:
   df = pd.DataFrame.from_records(data=arcpy.da.SearchCursor(i, j)) #reads to a df
    df['new'] = df[k].astype(str).apply(' '.join, axis=1)#concatenation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...