这段代码:
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
是否等于“stop”来创建一个 bool 掩码:
>>> 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
结束,此逻辑都应该有效。
关于python - 根据条件连接列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48373687/