Объедините списки словарей из строк, а затем извлеките из них строки, чтобы сформировать новую строку - PullRequest
1 голос
/ 17 октября 2019

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

df['category']

0 [{'id': '3120', 'name': '1109 Neurosciences'}, {'id': '2019', 'name': '1344 Statistics'}]
1 [{'id': '9572', 'name': '1234 Mathematics'}, {'id': '2345', 'name': '1307 Biology'}, {'id': '3456', 'name': '9876 Computer Science'}]
2 NaN
3 [{'id': '2378', 'name': '1398 Computer Vision'}]

Я хотел бы объединить все строки вместе и сделать этоновая строка и, если возможно, только часть данных.

Вывод будет выглядеть так:

df_new['category']

0 [Neurosciences, Statistics, Mathematics, Biology, Computer Science, Computer Vision]

Спасибо большое!

Ответы [ 3 ]

2 голосов
/ 17 октября 2019

Это должно работать

import itertools

def extract_name(l):
    try:
        return [''.join([i for i in _['name'] if not i.isdigit()]).strip() for _ in l] 
    except:
        return 

# apply the extract_name function and convert output to list
classes = df['category'].apply(extract_name).dropna().values.tolist()

# flatten the list
[*itertools.chain(*classes)]

Вывод:

['Neurosciences',
 'Statistics',
 'Mathematics',
 'Biology',
 'Computer Science',
 'Computer Vision']
1 голос
/ 17 октября 2019

Вы можете использовать df.explode () в пандах> 0,25.

df = df.dropna()
df = df.explode('cat')
df['cat'] = df['cat'].str.get('name').str.split().str[1]
df.index = len(df)*[0]
df = df.groupby(df.index)[['cat']].agg(' '.join)
print(df)

                                                 cat
0  Neurosciences Statistics Mathematics Biology C...
1 голос
/ 17 октября 2019
import pandas as pd
import numpy as np

data = [
    [{'id': '3120', 'name': '1109 Neurosciences'}, {'id': '2019', 'name': '1344 Statistics'}],
    [{'id': '9572', 'name': '1234 Mathematics'}, {'id': '2345', 'name': '1307 Biology'}, {'id': '3456', 'name': '9876 Computer Science'}],
    [np.nan],
    [{'id': '2378', 'name': '1398 Computer Vision'}]
    ]

global newrow
newrow = []

def parse(row):
    blacklist = ["id", "name","nan", "dtype", "object", "none"]
    s = str(row)
    s = ''.join(c for c in s if c not in "0123456789:,'{}")
    s = ' '.join([w for w in s.split() if w.lower() not in blacklist])
    [newrow.append(i) for i in s.split()]

df = pd.DataFrame(data)
df.apply(lambda row: parse(row) )
df_new = pd.DataFrame([newrow])
print(df_new)

ВЫХОД:

['Neurosciences',
 'Statistics',
 'Mathematics',
 'Biology',
 'Computer Science',
 'Computer Vision']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...