df = pd.DataFrame({
'subsegment': ['corp', np.nan, 'terr'],
'region': ['japan', np.nan, np.nan],
'subregion': [np.nan, 'se', 'ne'],
'segment': [np.nan,'ent','comm']
})
Run Code Online (Sandbox Code Playgroud)
我正在尝试迭代上面的数据帧,如果该值不是 NaN,则将列标题添加为新列“Mode”中的值或值的一部分(取决于 NaN 的数量)。
原始DF
| 子段 | 地区 | 次区域 | 部分 |
|---|---|---|---|
| 公司 | 日本 | 南 | 南 |
| 南 | 南 | 硒 | 耳鼻喉科 |
| 土地 | 南 | 讷 | 通讯 |
所需输出 DF
| 子段 | 地区 | 次区域 | 部分 | 模式 |
|---|---|---|---|---|
| 公司 | 日本 | 南 | 南 | 子段区域 |
| 南 | 南 | 硒 | 耳鼻喉科 | 次区域-部分 |
| 土地 | 南 | 讷 | 通讯 | 次分段-次区域-分段 |
我尝试使用不为空的列的所有组合创建单独的较小的 dfs,然后将这些 dfs 连接在一起,但这似乎效率极低。
df1 = df.loc[~(df['subsegment'].isna()) & (~df['region'].isna()) & (~df['region'].isna())]
df2 = df.loc[~(df['region'].isna()) & (~df['subregion'].isna()) & (~df['segment'].isna())]
df3 = df.loc[~(df['subsegment'].isna()) & (~df['subregion'].isna()) & (~df['segment'].isna())]
pd.concat(df1,df2,df3.....)
Run Code Online (Sandbox Code Playgroud)
您可以使用以下dot产品:
df['mode'] = (df.notna() @ (df.columns+'-')).str[:-1]
Run Code Online (Sandbox Code Playgroud)
输出:
subsegment region subregion segment mode
0 corp japan NaN NaN subsegment-region
1 NaN NaN se ent subregion-segment
2 terr NaN ne comm subsegment-subregion-segment
Run Code Online (Sandbox Code Playgroud)
或者,使用经典的groupby.agg:
s = df.notna().stack()
df['mode'] = s[s].reset_index().groupby('level_0')['level_1'].agg('-'.join)
Run Code Online (Sandbox Code Playgroud)
或者自定义聚合:
df['mode'] = df.notna().mul(df.columns).agg(lambda x: '-'.join(x[x.ne('')]), axis=1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |