我有一个包含 2 列的 DataFrame:
part content
0 'ok' 'A'
1 'ok' 'B'
2 '' 'C'
3 '' 'D'
4 '' 'E'
5 '' 'F'
6 'ok' 'G'
7 'ok' 'H'
8 '' 'I'
9 'ok' 'J'
10 '' 'K'
11 'ok' 'L'
12 '' 'M'
13 'ok' 'N'
14 '' 'O'
15 '' 'P'
我需要创建新列:
count
- 一组中项目的计数器if part == 'ok'
然后是组的第一个元素if part == ''
那么它是上面组的一部分
concat
- 连接一组中的项目take
- 一组中的最后一行,包含所有项目
它应该如下所示:
part content count concat take
0 'ok' 'A' 1 'A' True
1 'ok' 'B' 1 'B' False
2 '' 'C' 2 'BC' False
3 '' 'D' 3 'BCD' False
4 '' 'E' 4 'BCDE' False
5 '' 'F' 5 'BCDEF' True
6 'ok' 'G' 1 'G' True
7 'ok' 'H' 1 'H' False
8 '' 'I' 2 'HI' True
9 'ok' 'J' 1 'J' False
10 '' 'K' 2 'JK' True
11 'ok' 'L' 1 'L' False
12 '' 'M' 2 'LM' True
13 'ok' 'N' 1 'N' False
14 '' 'O' 2 'NO' False
15 '' 'P' 3 'NOP' True
然后我将过滤它以仅包含完整的行。
concat
0 'A'
1 'BCDEF'
2 'G'
3 'HI'
4 'JK'
5 'LM'
6 'NOP'
我需要有关第一部分的帮助 - 如何为组中的最后一行创建具有连续计数、串联和 True/False 的列。
另外 - 上面示例中的数据是匿名的:
- column
part
有 11 个不同的元素来分类它是内容的哪一部分。不只是ok
或''
- 列
content
有一行我正在分析的文档。它是一个 0-400 个字符的字符串。
最佳答案
嗯,这个问题包括三个子问题 q1 是使用 cumsum
创建组 key 然后 cumcount
, q2 是 cumsum
, q3就是得到每个子组位置的最大值,所以我们transform
max
df['count']=df.groupby(df.part.eq('ok').cumsum()).cumcount()+1
df['concat']=df.groupby(df.part.eq('ok').cumsum()).content.apply(lambda x : x.cumsum())
df['take']=df['count']==df.groupby(df.part.eq('ok').cumsum())['count'].transform('max')
df
part content count concat take
0 ok A 1 A True
1 ok B 1 B False
2 C 2 BC False
3 D 3 BCD False
4 E 4 BCDE False
5 F 5 BCDEF True
6 ok G 1 G True
7 ok H 1 H False
8 I 2 HI True
9 ok J 1 J False
10 K 2 JK True
11 ok L 1 L False
12 M 2 LM True
13 ok N 1 N False
14 O 2 NO False
15 P 3 NOP True
关于python - DataFrame 运行计数和连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58412758/