Python Pandas:使用字典中的元组创建具有列标题和单元格值的数据帧
我有一个简单的数据框架,有两列:Python Pandas:使用字典中的元组创建具有列标题和单元格值的数据帧,python,pandas,dataframe,dictionary,tuples,Python,Pandas,Dataframe,Dictionary,Tuples,我有一个简单的数据框架,有两列: 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 topic_0 topic_1 to
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 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”填充这些值。创建此数据帧的最佳方法是什么?您可以
分解列表,然后获取元组的第一个和第二个元素并透视
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)
首先,您需要知道总共有多少主题,然后创建一个新的列表,该列表中的每个元素都是一个列表,其中始终包含total_topics
元素,如果缺少,则不包含任何元素
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)
您可以使用transform并定义自己的函数
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
我怎么会不知道爆炸
。这就是rad。这个解决方案在解决我的问题时非常有效,因为我的列是“object”类型。非常感谢。希望这是你的“答案”tho:)
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