【问题标题】:Flattening shallow list with pandas用熊猫展平浅表
【发布时间】:2015-12-28 08:41:51
【问题描述】:

我正在尝试展平包含列表列表的 pandas.DataFrame 列的内容,但是我找不到获得正确输出的正确方法。

而不是在 StackOverflow 中询问同一主题的 different question,这里的重点是 pandas.DataFrame 的每一行内的讨人喜欢的过程。

这是一个玩具示例:

df = pd.DataFrame({ 'recipe': [['olive oil',
                            'low sodium chicken broth',
                            'cilantro leaves',
                            'chile powder',
                            'fresh thyme'],
                           ['coconut milk', 'frozen banana', 'pure acai puree', 'almond butter'],
                           ['egg',
                            'whole milk',
                            'extra-virgin olive oil',
                            'garlic cloves',
                            'corn kernels',
                            'chicken breasts']],
                   'category': ['A', 'B', 'B']
                  })
df_grouped = df.groupby('category')['recipe'].apply(lambda x: x.tolist())
df_grouped = df_grouped.reset_index()
df_grouped['recipe'][1]

这会产生以下输出:

[['coconut milk', 'frozen banana', 'pure acai puree', 'almond butter'],  ['egg',    'whole milk',   'extra-virgin olive oil',  'garlic cloves',   'corn kernels',    'chicken breasts']]

我的目标是逐行合并每个单词或句子列表。 我尝试使用以下代码,但它拆分了每个字母。

join = lambda list_of_lists: (val for sublist in list_of_lists for val in sublist)
df_grouped['merged'] = df_grouped['recipe'].apply(lambda x: list(join(x)))

df_grouped['merged']

这个产品:

0    [o, l, i, v, e,  , o, i, l, l, o, w,  , s, o, ... 

1    [c, o, c, o, n, u, t,  , m, i, l, k, f, r, o, ...

我想要每一行的以下输出,一个包含所有单词的数组

['coconut milk', 'frozen banana', 'pure acai puree', 'almond butter', 'egg',   'whole milk',   'extra-virgin olive oil',   'garlic cloves',   'corn kernels',   'chicken breasts']

【问题讨论】:

标签: python python-3.x pandas flatten


【解决方案1】:

我也遇到过类似的情况,但列表中使用的是整数而不是字符串。 Alex 的解决方案是抛出一个TypeError: 'int' object is not iterable 异常,所以我改用了这个函数:

def concat_lists(x):
    times = []
    try:
        for item in x:
            for time in item:
                times.append(time)
        return times
    except TypeError:
        return x

并像这样应用它:

df_grouped['merged'] = df_grouped['recipe'].apply(concat_lists)

【讨论】:

    【解决方案2】:

    只需将连接更改为:

    join = lambda list_of_lists: (val for sublist in list_of_lists for val in sublist if isinstance(sublist, list))
    

    这是输出:

    In[69]: df_grouped['merged'] = df_grouped['recipe'].apply(lambda x: list(join(x)))
    In[70]: df_grouped['merged']
    Out[70]: 
    0    [olive oil, low sodium chicken broth, cilantro...
    1    [coconut milk, frozen banana, pure acai puree,...
    Name: merged, dtype: object
    

    【讨论】:

    • 感谢@Alex,这绝对是我的问题的解决方案。
    猜你喜欢
    • 2018-12-01
    • 2018-11-21
    • 1970-01-01
    • 2015-05-17
    • 2022-01-12
    • 2020-12-28
    • 2021-06-13
    • 2016-11-29
    • 2022-11-10
    相关资源
    最近更新 更多