我有pandas数据框,其中列出了项目并对其进行了分类:
col_name |col_group
-------------------------
id | Metadata
listing_url | Metadata
scrape_id | Metadata
name | Text
summary | Text
space | Text
要重现:
import pandas
df = pandas.DataFrame([
['id','metadata'],
['listing_url','metadata'],
['scrape_id','metadata'],
['name','Text'],
['summary','Text'],
['space','Text']],
columns=['col_name', 'col_group'])
您能否建议我如何基于“ col_group”将此数据框转换为多个列表:
Metadata = ['id','listing_url','scraping_id]
Text = ['name','summary','space']
这是为了让我可以将这些列列表传递给panda并删除列。
我在Google上搜索了很多东西,被卡住了:所有答案都是关于将列表转换为df,反之亦然。我应该转换成词典还是列表列表?
我有100多行,属于10个类别,所以要避免手动进行硬编码。
答案 0 :(得分:2)
赞:
In [245]: res = df.groupby('col_group', as_index=False)['Col_name'].apply(list)
In [248]: res.tolist()
Out[248]: [['id', 'listing_url', 'scrape_id'], ['name', 'summary', 'space']]
答案 1 :(得分:1)
我已经尝试了以下代码:
import pandas
df = pandas.DataFrame([
[1, 'url_a', 'scrap_a', 'name_a', 'summary_a', 'space_a'],
[2, 'url_b', 'scrap_b', 'name_b', 'summary_b', 'space_b'],
[3, 'url_c', 'scrap_c', 'name_c', 'summary_c', 'space_ac']],
columns=['id', 'listing_url', 'scrape_id', 'name', 'summary', 'space'])
print(df)
for row in df.iterrows():
print(row[1].to_list())
给出以下答案:
[1, 'url_a', 'scrap_a', 'name_a', 'summary_a', 'space_a']
[2, 'url_b', 'scrap_b', 'name_b', 'summary_b', 'space_b']
[3, 'url_c', 'scrap_c', 'name_c', 'summary_c', 'space_ac']
您可以使用
for row in df[['name', 'summary', 'space']].iterrows():
仅遍历特定列。
答案 2 :(得分:1)
my_vars = df.groupby('col_group').agg(list)['col_name'].to_dict()
输出:
>>> my_vars
{'Text': ['name', 'summary', 'space'], 'metadata': ['id', 'listing_url', 'scrape_id']}
建议使用my_vars['Text']
来访问Text
,以此类推。如果必须作为不同的名称,则可以将其强制应用于目标范围,例如globals
:
globals().update(df.groupby('col_group').agg(list)['col_name'].to_dict())
结果:
>>> Text
['name', 'summary', 'space']
>>> metadata
['id', 'listing_url', 'scrape_id']
但是我建议您这样做,因为您可能会无意间覆盖了其他一些对象,或者它们可能不在您所需的适当范围内(例如locals
)。