Как мне сопоставить похожие имена с данной строкой, если они появляются через год, а не через год и появляются снова? - PullRequest
0 голосов
/ 15 июня 2019

Актуальный вопрос (не удалось добавить в заголовок, потому что он слишком длинный): у меня есть названия объектов в списке, где каждый список соответствует соответствующему году. Я хочу создать фрейм данных с каждой строкой, содержащей уникальное имя объекта. Проблема в том, что через несколько лет название объекта может появиться, а в следующем году оно может отсутствовать, а в следующем году оно может появиться снова и так далее. Также есть объекты, которые появляются не намного позже. Я пытался создать фрейм данных, который сопоставляет уникальные имена объектов со строкой (где они впервые появляются), но мне это не удалось.

Ideal:

Headers  = ['1999','2000','2001','2002','2003']
file1999 = ['Factory_A']
file2000 = ['Factory_A','Factory_B']
file2001 = ['Factory_B']
file2002 = ['Factory_A','Factory_C']
file2003 = ['Factory_A','Factory_B','Factory_C']

1999          2000           2001       2002       2003

Factory_A     Factory_A      NA         Factory_A  Factory_A

NA            Factory_B      Factory_B  NA         Factory_B

NA            NA             NA         Factory_C  Factory_C

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


df = pd.DataFrame({'Factories':['NaN']})
for i, j in zip((files), (Headers)):
    new_DF = pd.DataFrame({'Factories':i})
    df = df.merge(new_DF, on = ['Factories'],how='right')

# I got this with 'right'
    Factories
0   Factory_A
1   Factory_C
2   Factory_B

# I then tried to append a new column

df = pd.DataFrame({'Factories':['NaN']})
for i, j in zip(files, Headers):
    new_DF = pd.DataFrame({'Factories':i})
    df[j] = new_DF

# But I got this result instead:
    Factories   1999    2000    2001    2002    2003
0   NaN     Factory_A   Factory_A   Factory_B   Factory_A   Factory_A

Ответы [ 2 ]

1 голос
/ 16 июня 2019

У меня есть следующее решение:

from itertools import chain

lists = [file1999, file2000, file2001, file2002, file2003]
names = sorted(set(chain.from_iterable(lists)))
sets = map(set, lists)
dct = {col: [name if name in s else pd.np.nan for name in names] for col, s in zip(Headers, sets)}

df = pd.DataFrame(dct)
print(df)

Выход:

        1999       2000       2001       2002       2003
0  Factory_A  Factory_A        NaN  Factory_A  Factory_A
1        NaN  Factory_B  Factory_B        NaN  Factory_B
2        NaN        NaN        NaN  Factory_C  Factory_C
0 голосов
/ 16 июня 2019

Я бы сначала создал список из fileyyyy списков:

files = [file1999, file2000, file2001, file2002, file2003]

Тогда все просто:

words = sorted(set.union(*[set(file) for file in files]))

df = pd.DataFrame({k:
                   [word if (word in files[i]) else 'NA' for word in words]
                   for i, k in enumerate(Headers)})

Вы получаете:

1999       2000       2001       2002       2003
Factory_A  Factory_A         NA  Factory_A  Factory_A
       NA  Factory_B  Factory_B         NA  Factory_B
       NA         NA         NA  Factory_C  Factory_C
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...