我有一个“潜在的”大型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
答案 0 :(得分:2)
每组使用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()
结合了previous answer的解决方案:
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()