Python pandas只在某些列中移位null



我有一个这样的字典:

A     B       C      D        E      F     G     H      I      J
0      A.1   Data             Data                   223   52
1      A.2   Data     Data    Data                   12    6
2            A.4      Data                           32    365
3                    A.5     Data                   100   88
4      A.6   Data                                   654   98
5                    A.7     Data                   356   56

我想要的输出是这样的:

A     B       C      D        E      F     G     H      I      J
0      A.1   Data     Data                          223   52
1      A.2   Data     Data    Data                  12    6
2      A.4   Data                                   32    365
3      A.5   Data                                   100   88
4      A.6   Data                                   654   98
5      A.7   Data                                   356   56

只有列Ato列E将移动null,我有一个使用lamba的当前脚本,但所有数据帧都将null值移动到最后一列。我只需要一些列,有人能帮我吗?谢谢你!

def shift_null(arr):
return [x for x in arr if x == x] + [np.nan for x in arr if x != x]
df = df.T.apply(lambda arr: shift_null(arr)).T

您可以通过Series.dropna删除每行缺失的值,通过DataFrame.reindex添加可能仅缺失值的列,然后通过DataFrame.set_axis设置列名称:

cols = ['A','B','C','D','E']
df[cols] = (df[cols].apply(lambda x: pd.Series(x.dropna().tolist()), axis=1)
.reindex(range(len(cols)), axis=1)
.set_axis(cols, axis=1))
print (df)
A     B     C     D   E    F    G
0  A.1  Data  Data   NaN NaN  223   52
1  A.2  Data  Data  Data NaN   12    6
2  A.4  Data   NaN   NaN NaN   32  365
3  A.5  Data   NaN   NaN NaN  100   88
4  A.6  Data   NaN   NaN NaN  654   98
5  A.7  Data   NaN   NaN NaN  356   56

去掉DataFrame.apply中的转置和result_type='expand',你的溶液改变了:

cols = ['A','B','C','D','E']

def shift_null(arr):
return [x for x in arr if x == x] + [np.nan for x in arr if x != x]
df[cols] = df[cols].apply(lambda arr: shift_null(arr), axis=1, result_type='expand')
print (df)
A     B     C     D   E    F    G
0  A.1  Data  Data   NaN NaN  223   52
1  A.2  Data  Data  Data NaN   12    6
2  A.4  Data   NaN   NaN NaN   32  365
3  A.5  Data   NaN   NaN NaN  100   88
4  A.6  Data   NaN   NaN NaN  654   98
5  A.7  Data   NaN   NaN NaN  356   56

另一个想法是按key参数排序:

cols = ['A','B','C','D','E']
df[cols] = df[cols].apply(lambda x: x.sort_values(key=lambda x: x.isna()).tolist(), 
axis=1, result_type='expand')
print (df)
A     B     C     D   E    F    G
0  A.1  Data  Data   NaN NaN  223   52
1  A.2  Data  Data  Data NaN   12    6
2  A.4  Data   NaN   NaN NaN   32  365
3  A.5  Data   NaN   NaN NaN  100   88
4  A.6  Data   NaN   NaN NaN  654   98
5  A.7  Data   NaN   NaN NaN  356   56

通过DataFrame.stack重塑的解决方案,添加计数器的新列名和最后的重塑由Series.unstack:

s = df[cols].stack().droplevel(1)
s.index = [s.index, s.groupby(level=0).cumcount()]
df[cols] = s.unstack().rename(dict(enumerate(cols)), axis=1).reindex(cols, axis=1)
print (df)
A     B     C     D   E    F    G
0  A.1  Data  Data   NaN NaN  223   52
1  A.2  Data  Data  Data NaN   12    6
2  A.4  Data   NaN   NaN NaN   32  365
3  A.5  Data   NaN   NaN NaN  100   88
4  A.6  Data   NaN   NaN NaN  654   98
5  A.7  Data   NaN   NaN NaN  356   56

最新更新