我创建了以下熊猫数据框
import pandas as pd
import numpy as np
ds = {
'col1' :
[
['U', 'U', 'U', 'U', 'U', 1, 0, 0, 0, 'U','U', None],
[6, 5, 4, 3, 2],
[0, 0, 0, 'U', 'U'],
[0, 1, 'U', 'U', 'U'],
[0, 'U', 'U', 'U', None]
]
}
df = pd.DataFrame(data=ds)
数据框如下所示:
print(df)
col1
0 [U, U, U, U, U, 1, 0, 0, 0, U, U, None]
1 [6, 5, 4, 3, 2]
2 [0, 0, 0, U, U]
3 [0, 1, U, U, U]
4 [0, U, U, U, None]
对于中的每一行col1
,我需要检查U
列表中每个等于的元素是否后面(从左到右)跟着除和之外的任何值U
:None
在这种情况下,我将创建一个新列(称为iCount
),其值为 1。否则为 0。
在上面的例子中,生成的数据框看起来如下:
col1 iCount
0 [U, U, U, U, U, 1, 0, 0, 0, U, U, None] 1
1 [6, 5, 4, 3, 2] 0
2 [0, 0, 0, U, U] 0
3 [0, 1, U, U, U] 0
4 [0, U, U, U, None] 0
只有在第一行中,值后面U
跟着一个既不是也不U
是的值None
(它是1
)
我已经尝试过这个代码:
col5 = np.array(df['col1'])
for i in range(len(df)):
iCount = 0
for j in range(len(col5[i])-1):
print(col5[i][j])
if((col5[i][j] == "U") & ((col5[i][j+1] != None) & (col5[i][j+1] != "U"))):
iCount += 1
else:
iCount = iCount
但是我得到了这个(错误的)数据框:
col1 iCount
0 [U, U, U, U, U, 1, 0, 0, 0, U, U, None] 0
1 [6, 5, 4, 3, 2] 0
2 [0, 0, 0, U, U] 0
3 [0, 1, U, U, U] 0
4 [0, U, U, U, None] 0
有人能帮帮我吗?
尝试这个:
输出:
如果你只想测试是否至少有一个非 None 跟随 的情况
U
,请使用itertools.pairwise
和any
:输出:
如果您还想检查其他值直到下一个
U
,请使用自定义函数:例子:
澄清之前的原始答案
方法 1:仅考虑第一个项目
U
IIUC,使用自定义的 python 函数:
或者,使条件更加灵活:
输出:
更复杂的例子:
方法 2:考虑以下所有值
U
:只需在以前的方法中缩进标志重置,仅在尚未找到值时重置它:
例子:
代码
自由度
您可以在索引上使用
explode
,groupby
然后在条件为时对总和进行聚合True
:如果您
'iCount'
只需要包含0
或1
,而不是符合条件的值的总和,则sum
可以使用而不是any.astype(int)
:np.vecorize
与函数一起使用pd.Series
:或者用 创建一个简约函数
zip
。看起来正如OP提到的,值只能是
1
或0
。输出: