将行中的列表拆分成多个分块的行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将行中的列表拆分成多个分块的行相关的知识,希望对你有一定的参考价值。
我有一个熊猫数据框,其中某些行包含从系统返回的结果列表。我正在尝试将这些列表分成较小的块(在下面的可重现示例中为2个块),每个块作为新行。我确实确定可以使用numpy的repeat
函数复制行以为所需的每个块添加一行,但是然后我不确定如何只在Result中包括列表的一部分。 (即一行应为['SUCCESS', 'Misc]
,下一个['Doom']
与一行[['SUCCESS', 'Misc'],['Doom']]
)
我知道最好的解决方案是使用explode
仅使列表中的每个项目成为新行,但是由于客户的要求,这不是一种选择。
代码
import pandas as pd
import numpy as np
data = {'Result': [['SUCCESS'], ['SUCCESS'], ['FAILURE'], ['Pending', 'Pending', 'SUCCESS', 'Misc', 'Doom'], ['FAILURE'], ['Pending', 'SUCCESS']], 'Date': ['10/10/2019', '10/09/2019', '10/08/2019', '10/07/2019', '10/06/2019', '10/05/2019']}
goal = {'Result': [['SUCCESS'], ['SUCCESS'], ['FAILURE'], ['Pending', 'Pending'], ['SUCCESS'], ['FAILURE'], ['Pending', 'SUCCESS']], 'Date': ['10/10/2019', '10/09/2019', '10/08/2019', '10/07/2019', '10/06/2019', '10/05/2019', '10/04/2019']}
df = pd.DataFrame(data)
df['len_res'] = df['Result'].str.len()
def chunking(l, n):
for i in range(0, len(l), n):
yield l[i:i + n]
df['chunks'] = 1
for i in range(len(df)):
if df['len_res'][i] > 2:
df['Result'][i] = list(chunking(df['Result'][i], 2))
df['chunks'][i] = len(df['Result'][i])
else:
pass
实际输出
Result Date len_res chunks
0 [SUCCESS] 10/10/2019 1 1
1 [SUCCESS] 10/09/2019 1 1
2 [FAILURE] 10/08/2019 1 1
3 [[Pending, Pending], [SUCCESS, Misc], [Doom]] 10/07/2019 5 3
4 [FAILURE] 10/06/2019 1 1
5 [Pending, SUCCESS] 10/05/2019 2 1
所需的输出
Result Date len_res chunks
0 [SUCCESS] 10/10/2019 1 1
1 [SUCCESS] 10/09/2019 1 1
2 [FAILURE] 10/08/2019 1 1
3 [Pending, Pending] 10/07/2019 5 3
4 [SUCCESS, Misc] 10/07/2019 5 3
5 [Doom] 10/07/2019 5 3
6 [FAILURE] 10/06/2019 1 1
7 [Pending, SUCCESS] 10/05/2019 2 1
有 np.repeat
df = df.loc[np.repeat(df.index.values, df.chunks)]
df = df.reset_index(drop=True)
Result Date len_res chunks
0 [SUCCESS] 10/10/2019 1 1
1 [SUCCESS] 10/09/2019 1 1
2 [FAILURE] 10/08/2019 1 1
3 [[Pending, Pending], [SUCCESS, Misc], [Doom]] 10/07/2019 5 3
4 [[Pending, Pending], [SUCCESS, Misc], [Doom]] 10/07/2019 5 3
5 [[Pending, Pending], [SUCCESS, Misc], [Doom]] 10/07/2019 5 3
6 [FAILURE] 10/06/2019 1 1
7 [Pending, SUCCESS] 10/05/2019 2 1
如果您使用的是熊猫v0.25或更高版本,请使用explode
:
explode
[size = 2
df['Result'] = df['Result'].apply(lambda r: np.array_split(r, np.ceil(len(r) / size)))
df['chunks'] = df['Result'].str.len()
df = df.explode('Result')
将数组拆分为np.array_split
个部分:
n = ceil(len(r) / size)
[[1] --> [[1]]
[1,2] --> [[1,2]]
[1,2,3] --> [[1,2], [3]]
对explode
中数组最外层的每个元素重复每一行。
以上是关于将行中的列表拆分成多个分块的行的主要内容,如果未能解决你的问题,请参考以下文章
pandas GroupBy上的方法apply:一般性的“拆分-应用-合并”