Python Список в Dataframe с условиями - PullRequest
2 голосов
/ 17 марта 2020

У меня длинный список (пример ниже)

df_list = ['Joe',
 'UK',
 'Buyout',
 '10083',
 '4323',
 'http://info2.com',
 'Linda',
 'US',
 'Liquidate',
 '97656',
 '1223',
 'http://global.com',
 'linda@global.com'           
          ]

Как видите, список содержит информацию о человеке (Джо и Линды). Однако проблема в том, что для некоторых наблюдений (в данном примере Джо) мне не хватает 7-го элемента, который соответствует адресу электронной почты субъекта, потому что для Линды у нас есть адрес электронной почты этого человека, таким образом, заполненный.

Я хочу превратить этот список в фрейм данных с 7 столбцами (ниже), а для наблюдений, у которых нет действительного адреса электронной почты (не содержит "@"), я хочу поставить пустые / пустые значения вместо следующего элемента , который будет следующим столбцом ИМЯ следующего наблюдения для столбца электронной почты.

cols = ['NAME'
,'COUNTRY'
,'STRATEGIES'
,'TOTAL FUNDS'
,'ESTIMATED PAYOFF'
,'WEBSITE'
,'EMAIL']

Пока что я нахожусь на

big_list = []  #intention is to append N (number of unique entity) small_lists into a big_list and call pd.DataFrame(big_list)
small_list = [] #intention is to create a small_list for each observation/entity, containing 7 values, including email or null if empty
for element in df_list:
    small_list.append(element)
if ("@" not in small_list):
    small_list[-1] = None

Любая помощь будет принята с благодарностью! Спасибо

Ответы [ 3 ]

1 голос
/ 17 марта 2020

вы можете использовать генератор:

def gen_batch(df_list):
    i = 6
    while i <= len(df_list):
        if i < len(df_list) and '@' in df_list[i]:
            yield df_list[i-6: i+1] 
            i += 7
        else:
            yield df_list[i-6: i] + [pd.np.NAN]
            i += 6

pd.DataFrame(gen_batch(df_list), columns=cols)  

выход: enter image description here

1 голос
/ 17 марта 2020

IIU C вам нужно:

new_list = []
counter = 0
while True:
    try:
        if "@" not in df_list[counter+6]:
            new_list.append(df_list[counter:counter+6])
            counter += 6
        else:
            new_list.append(df_list[counter:counter+7])
            counter += 7
    except IndexError:
        break


df = pd.DataFrame(new_list, columns=cols)

print(df)

Вывод:

    NAME COUNTRY STRATEGIES TOTAL FUNDS ESTIMATED PAYOFF            WEBSITE  \
0    Joe      UK     Buyout       10083             4323   http://info2.com   
1  Linda      US  Liquidate       97656             1223  http://global.com   

              EMAIL  
0              None  
1  linda@global.com
0 голосов
/ 17 марта 2020

Это решение работает, если в списке отсутствуют email и websites.

Попробуйте:

import pandas as pd

df_list = ['Joe',
           'UK',
           'Buyout',
           '10083',
           '4323',
           'http://info2.com',
           'Linda',
           'US',
           'Liquidate',
           '97656',
           '1223',
           'http://global.com',
           'linda@global.com',
           'lana',
           'IN',
           'ABS',
           '18993',
           '2929',# --> missing email & website
           'Tom',
           'CH',
           'kitten',
           '38838',
           '2992', # --> missing website
           'tom@tom.com'
           ]

cols = ['NAME', 'COUNTRY', 'STRATEGIES', 'TOTAL FUNDS',
        'ESTIMATED PAYOFF', 'WEBSITE', 'EMAIL']

#----> Normalize list ----<
L = df_list[:]

idx = 0
while idx < len(L):
    if idx % 7 == 5 and '//' not in L[idx]:
        L.insert(idx, None)

    if idx % 7 == 6 and '@' not in L[idx]:
        L.insert(idx, None) 

    idx += 1


# ---> generate dictionary ------<
info = {col: L[i::7] for i, col in enumerate(cols)}
df = pd.DataFrame(info)
print(df)

Вывод:

   NAME COUNTRY STRATEGIES TOTAL FUNDS ESTIMATED PAYOFF            WEBSITE             EMAIL
0    Joe      UK     Buyout       10083             4323   http://info2.com              None
1  Linda      US  Liquidate       97656             1223  http://global.com  linda@global.com
2   lana      IN        ABS       18993             2929               None              None
3    Tom      CH     kitten       38838             2992               None       tom@tom.com
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...