Найти вхождения списка в списке списка в столбце данных - PullRequest
4 голосов
/ 17 июня 2019

У меня есть фрейм данных, df, с одним столбцом.

data = {'details': [['brand : honda', 'car : city', 'colour : black'],['brand : toyota', 'car : innova'],
                    ['brand : honda', 'colour : red'], ['brand : toyota', 'car : corolla', 'colour : white', 'type : sedan']]}
df = pd.DataFrame(data,columns= ['details'])
df

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

data = {'details': [['brand : honda', 'car : city', 'colour : black'],['brand : toyota', 'car : innova'],
                    ['brand : honda', 'colour : red'], ['brand : toyota', 'car : corolla', 'colour : white', 'type : sedan']],
        'brand': ['honda', 'toyota', 'honda', 'toyota'],
        'car': ['city','innova','','corolla'],
        'colour': ['black','','red','white'],
        'type': ['','','','sedan']
        }
df2 = pd.DataFrame(data,columns= ['details', 'brand', 'car', 'colour', 'type'])
df2

Я попробовал следующее, но это не сработало -

a2 = []
b2 = []
c2 = []
d2 = []
for i in df['details']:
    for j in range(len(i)):
        if 'brand :' in i[j]:
            print 'lalala'
            a1 = i[j]
            a2.append(a1)
        else:
            a1 = ''
            a2.append(a1)
        if 'car :' in i[j]:
            print 'lalala'
            b1 = i[j]
            b2.append(b1)
        else:
            b1 = ''
            b2.append(b1)
        if 'colour :' in i[j]:
            c1 = i[j]
            c2.append(c1)
        else:
            c1 = ''
            c2.append(c1)
        if 'type :' in i[j]:
            d1 = i[j]
            d2.append(d1)
        else:
            d1 = ''
            d2.append(d1)
df['brand'] = a2
df['car'] = b2
df['colour'] = c2
df['type'] = d2

Пожалуйста, помогите, поскольку я попал в крупный блокпост.

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Несколько более простой подход может быть следующим:

data = {'details': [['brand : honda', 'car : city', 'colour : black'],['brand : toyota', 'car : innova'],
                    ['brand : honda', 'colour : red'], ['brand : toyota', 'car : corolla', 'colour : white', 'type : sedan']]}

#takes a string and returns a dict based on ':'
def fix(l):
    return dict(s.split(':') for s in l)

#flatten and fix the lists of lists to get a list of dicts
dicts = [fix(i) for sublist in data.values() for i in sublist]

#Add the lists into a single dataframe (optional add the 'Details' column)
df = pd.DataFrame.from_dict(dicts)
df['details'] = pd.DataFrame.from_dict(data)  #adding 'Details' col
print(df)
    brand       car  colour    type   \
0    honda      city   black     NaN   
1   toyota    innova     NaN     NaN   
2    honda       NaN     red     NaN   
3   toyota   corolla   white   sedan   

                                             details  
0        [brand : honda, car : city, colour : black]  
1                     [brand : toyota, car : innova]  
2                      [brand : honda, colour : red]  
3  [brand : toyota, car : corolla, colour : white...  
0 голосов
/ 17 июня 2019

Вы можете попробовать следующее, если известны типы данных:

details_types = ['brand', 'car', 'colour', 'type']

for x in details_types :
    df[x] = None

for idx, value in df.iterrows(): 
    for col_details in df.iloc[idx, 0]:
        feature = col_details.replace(' ', '').split(':')[0]
        value = col_details.replace(' ', '').split(':')[1]
        df.iloc[idx, list(df.columns).index(feature)] = value

Выход

|   |                      details                      | brand  |   car   | colour | type  |
|---|---------------------------------------------------|--------|---------|--------|-------|
| 0 | [brand : honda, car : city, colour : black]       | honda  | city    | black  | None  |
| 1 | [brand : toyota, car : innova]                    | toyota | innova  | None   | None  |
| 2 | [brand : honda, colour : red]                     | honda  | None    | red    | None  |
| 3 | [brand : toyota, car : corolla, colour : white... | toyota | corolla | white  | sedan |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...