根据值的条件对数据框中的列重新排序
Re-order Columns In A Data Frame Depending On Conditions Of Values
a = [[0,0,0,0],[0,-1,1,0],[1,-1,1,0],[1,-1,1,0]]
df = pd.DataFrame(a, columns=['A','B','C','D'])
df
Output:
A B C D
0 0 0 0 0
1 0 -1 1 0
2 1 -1 1 0
3 1 -1 1 0
因此每列垂直向下阅读,列中的值都从第一行的 0 开始,一旦它们改变,它们就永远不会变回,并且可以变成 1 或 -1。我想重新排列数据框列,以便按以下顺序排列:
- 尽可能对最早的行中达到 1 的列进行排序
- 尽可能对最早的行中达到 -1 的列进行排序
- 最后剩下的行从未改变值并保持为零(如果还有的话)
Desired Output:
C A B D
0 0 0 0 0
1 1 0 -1 0
2 1 1 -1 0
3 1 1 -1 0
我的主数据框是 3000 行和 61 列长,有什么办法可以快速做到这一点?
我们必须分别处理正值和负值。一种方法是取 sum
的列,然后使用 sort_values
,我们可以调整顺序:
a = df.sum().sort_values(ascending=False)
b = pd.concat((a[a.gt(0)],a[a.lt(0)].sort_values(),a[a.eq(0)]))
out = df.reindex(columns=b.index)
print(out)
C A B D
0 0 0 0 0
1 1 0 -1 0
2 1 1 -1 0
3 1 1 -1 0
试试 pd.Series.first_valid_index
s = df.where(df.ne(0))
s1 = s.apply(pd.Series.first_valid_index)
s2 = s.bfill().iloc[0]
out = df.loc[:,pd.concat([s2,s1],axis=1,keys=[0,1]).sort_values([0,1],ascending=[False,True]).index]
out
Out[35]:
C A B D
0 0 0 0 0
1 1 0 -1 0
2 1 1 -1 0
3 1 1 -1 0
a = [[0,0,0,0],[0,-1,1,0],[1,-1,1,0],[1,-1,1,0]]
df = pd.DataFrame(a, columns=['A','B','C','D'])
df
Output:
A B C D
0 0 0 0 0
1 0 -1 1 0
2 1 -1 1 0
3 1 -1 1 0
因此每列垂直向下阅读,列中的值都从第一行的 0 开始,一旦它们改变,它们就永远不会变回,并且可以变成 1 或 -1。我想重新排列数据框列,以便按以下顺序排列:
- 尽可能对最早的行中达到 1 的列进行排序
- 尽可能对最早的行中达到 -1 的列进行排序
- 最后剩下的行从未改变值并保持为零(如果还有的话)
Desired Output:
C A B D
0 0 0 0 0
1 1 0 -1 0
2 1 1 -1 0
3 1 1 -1 0
我的主数据框是 3000 行和 61 列长,有什么办法可以快速做到这一点?
我们必须分别处理正值和负值。一种方法是取 sum
的列,然后使用 sort_values
,我们可以调整顺序:
a = df.sum().sort_values(ascending=False)
b = pd.concat((a[a.gt(0)],a[a.lt(0)].sort_values(),a[a.eq(0)]))
out = df.reindex(columns=b.index)
print(out)
C A B D
0 0 0 0 0
1 1 0 -1 0
2 1 1 -1 0
3 1 1 -1 0
试试 pd.Series.first_valid_index
s = df.where(df.ne(0))
s1 = s.apply(pd.Series.first_valid_index)
s2 = s.bfill().iloc[0]
out = df.loc[:,pd.concat([s2,s1],axis=1,keys=[0,1]).sort_values([0,1],ascending=[False,True]).index]
out
Out[35]:
C A B D
0 0 0 0 0
1 1 0 -1 0
2 1 1 -1 0
3 1 1 -1 0