[英]Get first occurrence value in each column
這是我的df。 我想獲得包含(F)
每列中的第一個值
>>> d = {0: ['1', '2(F)', '6', '8', '5'],
1: ['8(F)', '6', '8', '4(F)', '4'],
2: ['1', '6', '8(F)', '4(F)', '5'],
3: ['1', '8', '8', '1', '5']}
>>> df = pd.DataFrame(data=d)
>>> df
0 1 2 3
0 1 8(F) 1 1
1 2(F) 6 6 8
2 6 8 8(F) 8
3 8 4(F) 4(F) 1
4 5 4 5 5
結果應該是這樣的
0 2(F)
1 8(F)
2 8(F)
3 NaN
但是當我使用下面的代碼時,我收到了一些錯誤
>>> mask = df.apply(lambda x: x.str.contains('F'))
>>> a = mask.idxmax().where(mask.any())
>>> print(df[a])
KeyError: '[nan] not in index'
這是一種方式
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
使用numpy索引通過idxmax
獲取值,最后添加where
:
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
通過重塑另一種解決方案DataFrame.stack
,過濾並獲得第一個值GroupBy.first
,最后添加非通過存在價值Series.reindex
:
s = df.stack()
s = s[s.str.contains('F', na=False)].groupby(level=1).first().reindex(df.columns)
print (s)
0 2(F)
1 8(F)
2 8(F)
3 NaN
dtype: object
applymap
, lookup
mask = df.applymap(lambda x: '(F)' in x)
vals = df[mask].lookup(mask.idxmax(), df.columns)
pd.Series(vals, df.columns)
0 2(F)
1 8(F)
2 8(F)
3 NaN
dtype: object
過度設計
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)
這是一個單行,但它沒有給出第四行的答案:
df.replace("\\d$", np.nan, regex=True).dropna(how='all', axis=1).apply(lambda x: x.dropna().iloc[0], 0)
它清除除\\ F之外的所有元素,然后為每個列找出第一個非空元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.