使用 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)
我正在尝试展平包含列表列表的 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)