使用 pandas 展平浅列表

Flattening shallow list with pandas

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

而不是 different question 在 Whosebug 中询问同一主题,这里的重点是 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']]

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

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']

只需将联接更改为:

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 的解决方案是抛出一个 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)