Concat列值基于条件

时间:2018-01-22 01:45:52

标签: python pandas

此代码:

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

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

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']

然后访问前面的行?

1 个答案:

答案 0 :(得分:5)

首先,通过测试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()

现在分组:

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

使用累计金额,True映射到1,False映射到0.这用作分组。

脚注 - 无论系列中的最终值是否以stop结尾,此逻辑都应该有效。