我有一个这样的数据框:
df = pd.DataFrame({0: list('wxyz'), 1: [1,2,None,None], 2: [10,20,30,None]}).T
print(df)
0 1 2 3
0 w x y z
1 1 2 NaN NaN
2 10 20 30 NaN
如何将所有NA放在左边而不是右边?
必填:
0 1 2 3
0 w x y z
1 NaN NaN 1 2
2 NaN 10 20 30
答案 0 :(得分:3)
在字符串行中混合使用数字,因此解决方案是在DataFrame.apply
中将sorted
与key
参数一起使用:
df = df.apply(lambda x: pd.Series(sorted(x, key=pd.notna)), axis=1)
#alternative
#df = df.apply(lambda x: sorted(x, key=pd.notna), axis=1, result_type='expand')
print (df)
0 1 2 3
0 w x y z
1 NaN NaN 1 2
2 NaN 10 20 30
如果所有值都是数字,则使用justify可以更快地解决问题:
df = pd.DataFrame({1: [1,2,None,None], 2: [10,20,30,None]}).T
print(df)
0 1 2 3
1 1.0 2.0 NaN NaN
2 10.0 20.0 30.0 NaN
arr = justify(df.values, invalid_val=np.nan, side='right')
df = pd.DataFrame(arr, index=df.index, columns=df.columns)
print (df)
0 1 2 3
1 NaN NaN 1.0 2.0
2 NaN 10.0 20.0 30.0