Python 数据框单元格中的嵌套列表,如何提取?
我遇到了一个问题,在我的数据框的多个列中有嵌套列表。下图供参考- 我希望“Subreddit”列中的单元格成为新的列,“Times Needed”列中的单元格填充新的单元格。“产品名称”列将成为新索引 我试着使用pivot_表-Python 数据框单元格中的嵌套列表,如何提取?,python,pandas,pivot,pivot-table,nested-lists,Python,Pandas,Pivot,Pivot Table,Nested Lists,我遇到了一个问题,在我的数据框的多个列中有嵌套列表。下图供参考- 我希望“Subreddit”列中的单元格成为新的列,“Times Needed”列中的单元格填充新的单元格。“产品名称”列将成为新索引 我试着使用pivot_表- from pandas import pivot_table table = pivot_table(df_final, values='Times Mentioned', index=['Product Name'], columns=['Sub
from pandas import pivot_table
table = pivot_table(df_final, values='Times Mentioned', index=['Product
Name'], columns=['Subreddit'], aggfunc='size')
这成功地将“Subreddit”列的所有嵌套列表转换为新列,但“提到的次数”只是对每列重复第一个数字(下面的示例)
这应该是原始图像中的4,1,1,1。有人知道如何解决这个问题吗
提前谢谢你 DF中有一些单元格包含列表
['AsianBeauty', 'AsianBeautyAdvice','SkincareAddiction', 'abdiscussion']
这是一个单独的单元格,需要分解为同一列的单独行(Product Name
)。但是,这必须在保持Product Name
列与其他两列(其中包含必须分解的行)之间的关联的同时完成。我过去就是这样做的,同时保持协会的完整性。下面是我使用的方法,代码中的注释和顶层解释分别显示
来自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
)
原始数据列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
- 请注意,如果该行包含任何
- 对于原始DF中不包含所有
None
- 如有必要(在中解释),将单元格从具有列表的第一列(
)分解为第列Subreddit
- 将分解的单元格(现在为多行)与无列表列中的行水平连接(
);这将提供清洁的DFProduct Name
df1
- 使用带有列表的第二列重复上面的最后2个步骤(
);这将提供清洁的DF提到的次数
df1
- 将2个清理后的DFs水平连接到名为“已合并”的新DF中
- 对原始DF中的所有行重复上述步骤,并将清理后的DF追加到空白列表中
- 使用列表中所有DFs的垂直连接组装最终DF
- 如有必要(在中解释),将单元格从具有列表的第一列(
pandas==0.23.4
Python版本
Python 2.7.15rc1
请将代码和示例数据作为文本而不是图像发布,以便我们可以复制和粘贴experiment@PeterLeimbigler,已添加代码!如果还需要什么,请告诉我。非常感谢您的详细回答!我一直在“df1=pd.concat”行上遇到错误“TypeError:Index(…)必须用某种集合调用,传递了1”。应该注意的是,我的数据帧中确实有一个额外的列(布尔值,只有0和1),但我不知道在中添加该列将如何导致此错误?这很奇怪。我似乎无法复制它-我在代码中添加了这一行
df_final['test']=1
,但它不会影响我的输出…我仍然让代码正常工作。你用的是什么版本的熊猫?我使用的是pandas==0.23.4
(我将把它添加到我的答案中)。我同意额外的一栏不应该有什么不同,因为它没有被使用。试着删除那个额外的列并重新运行代码。啊,可能就是这样。我正在使用Python 3.6.5。我会做一些挖掘,看看这个版本不喜欢2.7.15。再次感谢你!我在python3.6.6::Anaconda custom(64位)
上使用了它,也使用了pandas==0.23.4
,仍然没有类型错误。我还将我正在使用的原始DF添加到我的答案中,其中显示了所有列及其数据类型(object
),以便与您的数据帧进行比较……以防有所帮助。
pandas==0.23.4
Python 2.7.15rc1