微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 基于条件的Concat列值

这段代码

import numpy as np
import pandas as pd

df = pd.DataFrame(['a1', 'a2', 'stop', 'a4', 'a4', 'a5', 'stop', 'a3'],
                  columns=['c'])

呈现:

      c
0    a1
1    a2
2  stop
3    a4
4    a4
5    a5
6  stop
7    a3

我正在尝试生成以下数据框,其中列中的值被连接,直到遇到“停止”值:

columns = ['c1' , 'c2']
data = np.array([['a1, a2','stop'] , ['a4, a4, a5','stop']])
df = pd.DataFrame(data, columns=columns)
df

           c1    c2
0      a1, a2  stop
1  a4, a4, a5  stop

这是一种有效的方法,过滤列值为’stop’的行:

df[df['c'] == 'stop']

然后访问前面的行?

解决方法:

首先,通过测试c的等于“停止”来创建一个布尔掩码:

>>> df = pd.DataFrame(['a1', 'a2', 'stop', 'a3', 'a4', 'a5', 'stop', 'a6'],
                      columns=['c'])
>>> mask = df['c'].eq('stop')

您还指定要在最终停止后忽略值.截断两个系列:

>>> stop = mask[::-1].idxmax()
>>> mask = mask[:stop]
>>> c = df['c'][:stop].copy()

现在groupby:

>>> c.groupby(mask.cumsum()).apply(lambda s: s[s!='stop'].tolist())
c
0        [a1, a2]
1    [a4, a4, a5]

使用累积和,True映射到1,False映射到0.这用作分组.

脚注 – 无论系列中的最终值是否以停止结束,此逻辑都应该有效.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐