【问题标题】:Unpacking cells containing list of lists in Pandas DataFrame into separate rows and columns of a new DataFrame将包含 Pandas DataFrame 中列表列表的单元格解压缩到新 DataFrame 的单独行和列中
【发布时间】:2018-11-15 08:50:15
【问题描述】:

我有 DataFrame df:

    a  b                   c
0   7  5  [[-4, 7], [-5, 6]]
1  13  5  [[-9, 4], [-3, 7]]

我想将包含列表单元格列表(列'c')的列展平到一个单独的 DataFrame 中,这样:

  1. 单独的列表对应于各个条目
  2. 单独列表的元素被拆分为新列

我设法在下面获得了所需的结果(我知道有一个 int 到 float 的转换,但这对我来说并不麻烦):

    a  b    d    e
0   7  5 -4.0  7.0
1   7  5 -5.0  6.0
2  13  5 -9.0  4.0
3  13  5 -3.0  7.0

但是,我认为我这样做的方式并不理想,因为它首先使用了大量代码,其次使用了iterrows()。

下面是我的代码:

old_cols = list(df)
old_cols.remove('c')
new_cols = ['d', 'e']
all_cols = old_cols + new_cols
df_flat = pd.DataFrame(columns=all_cols)
for idx, row in df.iterrows():
    data = row['c']
    for entry in data:
        temp_series = pd.Series(index=new_cols)
        temp_series['d'] = entry[0]
        temp_series['e'] = entry[1]
        new_row = pd.concat([row[old_cols], temp_series])
        df_flat = df_flat.append(new_row, ignore_index=True)

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    将groupby+apply 与pd.DataFrame 一起使用:

    df = df.groupby(['a','b'])\
           .apply(lambda x: pd.DataFrame(x['c'].tolist()[0], columns=['c','d']))\
           .reset_index([0,1]).reset_index(drop=True)
    
    print(df)
        a  b  c  d
    0   7  5 -4  7
    1   7  5 -5  6
    2  13  5 -9  4
    3  13  5 -3  7
    

    说明:

    因为c 列中的每个值都是列表列表。为了对它们进行打包并使它们成为不同的列,我们采用 x['c'].tolist() 这包含 2 个开括号和右括号 ([[[values],[values]]]),它们没有用,所以 x['c'].tolist()[0] 给出了 [[values],[values]],它用作 pd.DataFrame 的数据,列 @ 987654334@ 和 levels = [0,1] 上的最后一个 reset_index 是 ['a','b'] 列。

    print(pd.DataFrame([[-4, 7], [-5, 6]],columns=['c','d']))
       c  d
    0 -4  7
    1 -5  6
    
    print(df.groupby(['a','b'])\
            .apply(lambda x: pd.DataFrame(x['c'].tolist()[0], columns=['c','d'])))
            c  d
    a  b        
    7  5 0 -4  7
         1 -5  6
    13 5 0 -9  4
         1 -3  7
    

    【讨论】:

    • 一点解释肯定有助于理解更多:-)
    猜你喜欢
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2021-07-10
    • 2015-01-24
    • 2021-11-08
    相关资源
    最近更新 更多