如果列中的值不是 NaN (Pandas),则迭代数据框并基于创建新列

mtm*_*186 3 python pandas

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)

moz*_*way 7

您可以使用以下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)