如何从仅含单个杂乱列的DataFrame中提取fruit_name和fruit_colour
解决方案
核心思路是通过分组关联顺序出现的水果名称和颜色属性,自动跳过无关内容,缺失值默认补NaN,最简实现如下:
import pandas as pd import numpy as np # 给每个水果分配唯一分组号,每遇到一次fruit_name分组号+1 df['group'] = (df['col'] == 'fruit_name').cumsum() # 关联提取对应名称和颜色 fruit_df = pd.DataFrame({ 'fruit_name': df.loc[df['col'].shift() == 'fruit_name', 'col'].values, 'fruit_colour': df.loc[df['col'].shift() == 'fruit_colour', ['group', 'col']] .drop_duplicates('group', keep='first') .set_index('group') .reindex(range(1, df['group'].max()+1))['col'].values }).reset_index(drop=True)
如果追求更短的代码,还可以通过向量化操作进一步简化:
s = df['col'] res = pd.DataFrame({ 'fruit_name': s[s.shift() == 'fruit_name'].tolist(), 'fruit_colour': s.groupby((s == 'fruit_name').cumsum()).apply( lambda x: x[x.shift() == 'fruit_colour'].iloc[0] if any(x.shift() == 'fruit_colour') else np.nan ).tolist() })
两种实现都可以输出要求的结果:
| fruit_name | fruit_colour | |
|---|---|---|
| 0 | apple | green |
| 1 | banana | yellow |
| 2 | pear | NaN |
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

