Python 获取每列中的第一个引用值

Python 获取每列中的第一个引用值,python,pandas,dataframe,Python,Pandas,Dataframe,这是我的df。 我想得到每列中包含(F) >d={0:['1','2(F)','6','8','5'], 1:[8(F),"6","8","4",, 二:[1,6,8(F),"4(F),"5",, 3: ['1', '8', '8', '1', '5']} >>>df=pd.DataFrame(数据=d) >>>df 0 1 2 3 018(F)11 1 2(F)6 8 2 6 8(F)8 384(F)4(F)1 4 5 4 5 5 结果应该是这样的

这是我的df。 我想得到每列中包含
(F)

>d={0:['1','2(F)','6','8','5'],
1:[8(F),"6","8","4",,
二:[1,6,8(F),"4(F),"5",,
3: ['1', '8', '8', '1', '5']}
>>>df=pd.DataFrame(数据=d)
>>>df
0     1     2  3
018(F)11
1 2(F)6 8
2 6 8(F)8
384(F)4(F)1
4     5     4     5  5
结果应该是这样的

02(F)
18(F)
2 8(F)
3南
但是当我使用下面的代码时,我收到了一些错误

>>> mask = df.apply(lambda x: x.str.contains('F'))
>>> a = mask.idxmax().where(mask.any())
>>> print(df[a])

KeyError: '[nan] not in index'

通过
idxmax
和上次添加
where
,使用numpy索引获取值:

mask = df.apply(lambda x: x.str.contains('F', na=False))
a = mask.idxmax()   
s = pd.Series(df.values[a, a.index]).where(mask.any())
print(s)
0    2(F)
1    8(F)
2    8(F)
3     NaN
dtype: object
另一个解决方案具有“重塑依据”、“筛选”和“获取第一个值依据”、“最后添加不存在的值依据”:

applymap
lookup

核型变异体 过度设计

from numpy.core.defchararray import find

v = df.values.astype(str)
m = find(v, '(F)') >= 0
i = m.argmax(0)
j = np.arange(v.shape[1])

pd.Series(np.where(m[i, j], v[i, j], np.nan), df.columns)
这里有一条路

mask = df.applymap(lambda x: '(F)' in x)

df[mask].bfill().iloc[0,]
Out[624]: 
0    2(F)
1    8(F)
2    8(F)
3     NaN
Name: 0, dtype: object

这是一行,但它没有给出第四行的答案:

df.replace(“\d$”,np.nan,regex=True).dropna(how='all',axis=1).apply(lambda x:x.dropna().iloc[0],0)

它清除除\F之外的所有元素,然后为每列找出第一个非空元素

from numpy.core.defchararray import find

v = df.values.astype(str)
m = find(v, '(F)') >= 0
i = m.argmax(0)
j = np.arange(v.shape[1])

pd.Series(np.where(m[i, j], v[i, j], np.nan), df.columns)
mask = df.applymap(lambda x: '(F)' in x)

df[mask].bfill().iloc[0,]
Out[624]: 
0    2(F)
1    8(F)
2    8(F)
3     NaN
Name: 0, dtype: object