Pandas: создание фрейма данных с заголовками столбцов и значениями ячеек из кортежей в словаре - PullRequest
2 голосов
/ 19 апреля 2020

У меня есть простой pandas фрейм данных с двумя столбцами:

document  document_topics 
0         [(0, 0.0280), (1, 0.0372), (2, 0.0131), ... (42, 0.0969)]
1 ...     [(1, 0.0829), (3, 0.0161), (4, 0.0141), ... (27, 0.2275)]

Столбец document_topics - это кортеж (topi c, weight). Я хотел бы разделить 'document_topics' и получить фрейм данных вроде:

document  topic_0  topic_1  topic_2 topic_3 topic_4...
0         0.0280   0.0372   0.0131  NaN     NaN  
1 ...     NaN      0.0829   NaN     0.0161  0.0141

Не каждый документ имеет все темы, связанные с ним, поэтому я хотел бы заполнить эти значения с помощью 'NaN'. Каков наилучший способ создать этот фрейм данных?

Ответы [ 3 ]

3 голосов
/ 19 апреля 2020

Вы можете explode списки, затем захватить первый и второй элемент кортежей и pivot.

df = df.explode('document_topics') 

df = (df.assign(topic=df.document_topics.str[0], 
                vals=df.document_topics.str[1])
        .pivot(index='document', columns='topic', values='vals'))

# Clean up names, add prefixes
df = df.add_prefix('topic_').reset_index().rename_axis(columns=None)

   document  topic_0  topic_1  topic_2  topic_3  topic_4  topic_27  topic_42
0         0    0.028   0.0372   0.0131      NaN      NaN       NaN    0.0969
1         1      NaN   0.0829      NaN   0.0161   0.0141    0.2275       NaN
1 голос
/ 19 апреля 2020

Сначала вам нужно узнать, сколько всего у вас тем total_topics, затем создать новый список списка, каждый элемент в этом списке - это список, в котором всегда есть элемент total_topics и None, если он отсутствует.

document_topics = df.document_topics.to_list()
topics = sum(document_topics, [])
topics = set([topic[0] for topic in topics])
for i, document_topic in enumerate(document_topics):
    document_topic = dict(document_topic)
    document_topics[i] = []
    for topic in topics:
        document_topics[i].append(document_topic[topic] if topic in document_topic else None)
columns = [f'topic_{i}' for i in topics]
df_new = pd.DataFrame(data=document_topics, columns=columns)
0 голосов
/ 19 апреля 2020

Вы можете использовать преобразование и определить свою собственную функцию

df = pd.DataFrame(columns=['document_topics'])
df.loc[len(df), df.columns[0]] = [(0, 0.0280),
                                (1, 0.0372), (2, 0.0131), (3, 0.0969)]

df.loc[len(df), df.columns[0]] = [(0, 0.0280), (1, 0.0280),
                            (2, 0.0372), (3, 0.0131), (42, 0.0969)]


def fun(row):
    df = pd.DataFrame(row, columns=['idx', 'vals'])
    df['idx_index'] = 'topic_' + df['idx'].astype(str)
    df.set_index('idx_index', inplace=True)
    return df['vals']


df.document_topics.transform(fun)

# topic_0   topic_1 topic_2 topic_3 topic_42
# 0 0.028   0.0372  0.0131  0.0969  NaN
# 1 0.028   0.0280  0.0372  0.0131  0.0969
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...