Анализ из многолистового файла Excel: понимание списка между столбцами - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь проанализировать файл Excel, который имеет много листов.На каждом листе есть столбец со следующей информацией (3 листа = 3 столбца):

ReceivedEmail    OpenedEmail    ClickedURL
aaaa@aaa.com     gggg@aaa.com   aaaa@aaa.com
bbbb@aaa.com     dddd@aaa.com   rrrr@aaa.com
cccc@aaa.com     rrrr@aaa.com
dddd@aaa.com     aaaa@aaa.com
eeee@aaa.com     oooo@aaa.com
ffff@aaa.com
gggg@aaa.com
rrrr@aaa.com
qqqq@aaa.com
oooo@aaa.com

Мне нужна отдельная таблица, в которой сохранен первый столбец первого листа, то есть тот, в котором есть все данные, касающиесяReceivedEmail (люди, которых мы отправили по электронной почте).Следующие столбцы должны быть каждым первым столбцом следующего листа, но вместо того, чтобы повторять электронные письма, я хочу использовать списочное понимание, чтобы проверить, существует ли OpenedEmail в ReceivedEmail и дать 1 , иначе дать 0 .

Вот что я сделал до сих пор:

import pandas as pd
xl = pd.ExcelFile(path_to_file)
xl.sheet_names
['ReceivedEmail', 'OpenedEmail', 'ClickedURL']
df = xl.parse(sheet_name=xl.sheet_names[0], header=None)
df.rename(columns={df.columns[0]:xl.sheet_names[0]}, inplace=True);
df.columns[0]
['ReceivedEmail']
# then I created a buffer dataframe to check next columns
df_buffer = xl.parse(sheet_name=xl.sheet_names[1], header=None)
df_buffer.rename(columns={df_buffer.columns[0]:xl.sheet_names[1]}, inplace=True);

Но затем, когда я запускаю понимание списка следующим образом:

df[df_buffer.columns[0]] = [1 if x in df[df.columns[0]] else 0 for x in df_buffer[df_buffer.columns[0]]]

Я получаю ошибку:

ValueError: длина значений не совпадает с длиной индекса

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

Конечный результат должен быть:

ReceivedEmail    OpenedEmail    ClickedURL
aaaa@aaa.com         1              1
bbbb@aaa.com         0              0      
cccc@aaa.com         0              0     
dddd@aaa.com         1              0
eeee@aaa.com         0              0    
ffff@aaa.com         0              0  
gggg@aaa.com         1              0
rrrr@aaa.com         1              1
qqqq@aaa.com         0              0
oooo@aaa.com         1              0

1 Ответ

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

Вы можете использовать read_excel с параметром sheetname=None для возврата всех листов в упорядоченный словарь фреймов данных:

Примечание:

Каждый лист имеет один столбец.

dfs = pd.read_excel('file.xlsx', sheetname=None)
print (dfs)
OrderedDict([('ReceivedEmail',               a
0  aaaa@aaa.com
1  bbbb@aaa.com
2  cccc@aaa.com
3  dddd@aaa.com
4  eeee@aaa.com
5  ffff@aaa.com
6  gggg@aaa.com
7  rrrr@aaa.com
8  qqqq@aaa.com
9  oooo@aaa.com), ('OpenedEmail',               a
0  gggg@aaa.com
1  dddd@aaa.com
2  rrrr@aaa.com
3  aaaa@aaa.com
4  oooo@aaa.com), ('ClickedURL',               a
0  aaaa@aaa.com
1  rrrr@aaa.com)])

Затем объедините и измените порядок по подмножеству [], а для каждого столбца из второго проверочного членства - isin, последнее преобразование маски логики в целые числа.

cols = list(dfs.keys())
df = pd.concat({k: v.iloc[:, 0] for k, v in dfs.items()}, axis=1)[cols]

df.iloc[:, 1:] = df.iloc[:, 1:].apply(lambda x: df.iloc[:, 0].isin(x)).astype(int)
print (df)
  ReceivedEmail OpenedEmail ClickedURL
0  aaaa@aaa.com           1          1
1  bbbb@aaa.com           0          0
2  cccc@aaa.com           0          0
3  dddd@aaa.com           1          0
4  eeee@aaa.com           0          0
5  ffff@aaa.com           0          0
6  gggg@aaa.com           1          0
7  rrrr@aaa.com           1          1
8  qqqq@aaa.com           0          0
9  oooo@aaa.com           1          0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...