使用pandas

时间:2015-09-30 14:03:44

标签: python python-3.x pandas flatten

我正在尝试压缩包含列表列表的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']

2 个答案:

答案 0 :(得分:1)

只需将联接更改为:

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

答案 1 :(得分:0)

我也有类似的情况,但是列表中有整数而不是字符串。 Alex的解决方案引发了 return Promise.resolve( () => { return ref.function(value); }).then( k => { ... }).catch( err => { updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error when invoked function has an error (2) callBack(err); }); 异常,因此我改用了此函数:

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