此代码:
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']
然后访问前面的行?
答案 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
结尾,此逻辑都应该有效。