Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据框单元格中的嵌套列表,如何提取?_Python_Pandas_Pivot_Pivot Table_Nested Lists - Fatal编程技术网

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

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

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

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

我试着使用pivot_表-

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
      )分解为第列
    • 将分解的单元格(现在为多行)与无列表列中的行水平连接(
      Product Name
      );这将提供清洁的DF
      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