用分组约束将列值向左移动[英] Shift column values to the left with group constraints

本文是小编为大家收集整理的关于用分组约束将列值向左移动的处理方法,想解了用分组约束将列值向左移动的问题怎么解决?用分组约束将列值向左移动问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个"可能"很大的 DataFrame,

     A    B_1    B_2    B_3    C_1    C_2    C_3
0  231  text2  text3    NaN  date4  date1    NaN
1  443  NaN    NaN    text1  date2    NaN    NaN
2  456  text1  text1  text2  NaN    date3  date1

为了最小化一些 NaN ,我想将所有数据向左移动,从而能够忽略所有 NaN 列.这种转变必须保持在适当的组内,这意味着一个单元格是在 B_1 列还是 B_2 列中并不重要,只要它没有被转移到 C_1 等.

我想要的结果是这样的,

     A    B_1    B_2    B_3    C_1    C_2    
0  231  text2  text3    NaN  date4  date1
1  443  text1    NaN    NaN  date2    NaN
2  456  text1  text1  text2  date3  date1

推荐答案

对每个组使用 justify 函数,只需要MultiIndex 在列中:

df = df.set_index('A')
df.columns = df.columns.str.split('_', expand=True)

f = lambda x: pd.DataFrame(justify(x.values, invalid_val=np.nan), 
                           index=x.index, columns=x.columns)
df = df.groupby(axis=1, level=0).apply(f)
print (df)
         B                    C            
         1      2      3      1      2    3
A                                          
231  text2  text3    NaN  date4  date1  NaN
443  text1    NaN    NaN  date2    NaN  NaN
456  text1  text1  text2  date3  date1  NaN

然后:

df1.columns = [f'{a}_{b}' for a, b in df1.columns]
df1 = df1.reset_index()
<小时>

结合上一个答案的解决方案:

g = df.groupby('A').cumcount() + 1
df1 = df.set_index(['A', g]).unstack()

f = lambda x: pd.DataFrame(justify(x.values, invalid_val=np.nan), 
                           index=x.index, columns=x.columns)
df1 = df.groupby(axis=1, level=0).apply(f)

df1.columns = [f'{a}_{b}' for a, b in df1.columns]
df1 = df1.reset_index()

本文地址:https://www.itbaoku.cn/post/1727982.html