gpt4 book ai didi

python - Pandas 数据框单元格中的嵌套列表,如何提取?

转载 作者:行者123 更新时间:2023-12-05 06:29:55 25 4
gpt4 key购买 nike

我遇到了一个问题,我在数据框的多个列中嵌套了列表。下图供引用 -

image of dataframe

df_final['Product Name'] = ('dr. jart+ mask heroes face savers', 
'moon juice beauty shroom exfoliating acid
potion',
'laneige kiss and make up set')

df_final['Subreddit'] = (None, ['scacjdiscussion'], ['AsianBeauty',
'AsianBeautyAdvice','SkincareAddiction',
'abdiscussion'])

df_final['Times Mentioned'] = (None, [1], [4,1,1,1])

我希望“Subreddit”列中的单元格成为新列,“Times Mentioned”列中的单元格填充新单元格。 “产品名称”列将成为新索引。

我尝试使用 pivot_table -

from pandas import pivot_table

table = pivot_table(df_final, values='Times Mentioned', index=['Product
Name'], columns=['Subreddit'], aggfunc='size')

这成功地将“Subreddit”列的所有嵌套列表转换为新列,但“提及次数”只是重复每一列的第一个数字(如下例)

wrong cell fillers

这应该是原始图像中的 4, 1, 1, 1。有谁知道如何解决这一问题?

提前致谢!

最佳答案

DF中有一些单元格包含一个列表

['AsianBeauty', 'AsianBeautyAdvice','SkincareAddiction', 'abdiscussion']

这是一个单独的单元格,需要分解成同一列(产品名称)的不同行。但是,这必须在保留 Product Name 列与其他 2 列(包含必须展开的行)中的每一列之间的关联的同时完成。我用了this SO post做到这一点,同时保持关联完整。这是我使用的方法,代码中的注释和顶级解释分开显示

来自 OP 的原始 DF

import pandas as pd


df_final = pd.DataFrame()
df_final['Product Name'] = ('dr. jart+ mask heroes face savers',
'moon juice beauty shroom exfoliating acid potion',
'laneige kiss and make up set')

df_final['Subreddit'] = (None, ['scacjdiscussion'], ['AsianBeauty',
'AsianBeautyAdvice','SkincareAddiction',
'abdiscussion'])

df_final['Times Mentioned'] = (None, [1], [4,1,1,1])
print(df_final)

原始数据(df_final)

                                       Product Name                                                          Subreddit Times Mentioned
0 dr. jart+ mask heroes face savers None None
1 moon juice beauty shroom exfoliating acid potion [scacjdiscussion] [1]
2 laneige kiss and make up set [AsianBeauty, AsianBeautyAdvice, SkincareAddiction, abdiscussion] [4, 1, 1, 1]

原始数据列dtypes

print(df_final.dtypes)
Product Name object
Subreddit object
Times Mentioned object
dtype: object

分解行并创建最终 DF 的代码

exploded_dfs = []
for _, row in df_final.iterrows():
if all(row): # if a row does contain all non-None values
# Put 1st pair of columns into single DF, exploding single
# cell into multiple rows as needed
df1 = pd.concat([pd.Series(row['Product Name'], row['Subreddit'][:])])\
.reset_index()
# Assign column names
df1.columns = ['Subreddit', 'Product Name']
# Put 2nd pair of columns into single DF, exploding single
# cell into multiple rows as needed
df2 = pd.concat([pd.Series(row['Product Name'], row['Times Mentioned'][:])])\
.reset_index()
# Assign column names
df2.columns = ['Times Mentioned', 'Product Name']
# Perform INNER JOIN on DFs with exploded row contents
# & drop duplicated column
merged = pd.concat([df1, df2], axis=1)
merged = merged.loc[:,~merged.columns.duplicated()]
# Swap 1st and 2nd columns
cols = list(merged)
cols.insert(0, cols.pop(cols.index('Product Name')))
merged = merged.loc[:, cols]
else: # if a row does not contain all non-None values
# Create single row DF with no changes
merged = pd.DataFrame(columns=['Product Name', 'Subreddit',
'Times Mentioned'])
# Append row to DF
merged.loc[0] = row
exploded_dfs.append(merged)

# Vertically concatenate DFs in list
print(pd.concat(exploded_dfs, axis=0).reset_index(drop=True))

这是输出

                                       Product Name          Subreddit Times Mentioned
0 dr. jart+ mask heroes face savers None None
1 moon juice beauty shroom exfoliating acid potion scacjdiscussion 1
2 laneige kiss and make up set AsianBeauty 4
3 laneige kiss and make up set AsianBeautyAdvice 1
4 laneige kiss and make up set SkincareAddiction 1
5 laneige kiss and make up set abdiscussion 1

步骤简述

  • 遍历所有行
    • 请注意,如果该行包含任何None 值,它将按原样处理,因此假定该行不需要清理:该行将只是appended to a single row DF
  • 对于原始 DF 中不包含所有 None 的第一行
    • 如有必要,将带有列表 (Subreddit) 的第一列的单元格分解为列(在 this question 中解释)
    • 将展开的单元格(现在为多行)与没有列表的列中的行水平连接(产品名称);这给出了干净的 DF df1
    • 使用带有列表的第二列重复上面的最后两个步骤(提及次数);这给出了干净的 DF df1
    • 将 2 个清理过的 DF 水平连接成名为 merged 的新 DF
    • 对原始 DF 中的所有行重复上述过程并将清理后的 DF 附加到空白列表
    • 使用列表中所有 DF 的垂直串联组装最终 DF

包裹信息

pandas==0.23.4

Python 版本

Python 2.7.15rc1

关于python - Pandas 数据框单元格中的嵌套列表,如何提取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52920968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com