如何使用方法链更改 pandas 数据框中列的顺序?
How to change the order of columns in a pandas dataframe using a method chain?
使用方括号更改 pandas 数据框中列的顺序很容易(见下文,我在这里切换了前两列)。但是,我找不到任何有关如何使用方法链执行此操作的信息,这在 R 中使用 dplyr::select()
很容易。例如,我想要这样的东西:df.reorder_columns(["num_wings","num_legs","num_specimen_seen"]),其中"reorder_columns"是编出来的方法。
df = pd.DataFrame({'num_legs': [2, 4, 8, 0],
'num_wings': [2, 0, 0, 0],
'num_specimen_seen': [10, 2, 1, 8]},
index=['falcon', 'dog', 'spider', 'fish'])
df[["num_wings","num_legs","num_specimen_seen"]]
我知道 python 宇宙中有一些 dplyr 复制猫,但我想避免使用这些软件包,因为它们被认为是“前沿”
您使用 .loc
访问器。这同样适用于行和列。
df = (
pd.DataFrame({
'num_legs': [2, 4, 8, 0],
'num_wings': [2, 0, 0, 0],
'num_specimen_seen': [10, 2, 1, 8]
}, index=['falcon', 'dog', 'spider', 'fish'])
.loc[
['dog', 'spider', 'falcon', 'fish'], # rows
["num_wings", "num_legs", "num_specimen_seen"] # columns
]
)
也许你可以尝试这样的事情:
import pandas as pd
df = pd.DataFrame({'num_legs': [2, 4, 8, 0],
'num_wings': [2, 0, 0, 0],
'num_specimen_seen': [10, 2, 1, 8]},
index=['falcon', 'dog', 'spider', 'fish'])
columnsNames = ['num_wings', 'num_legs', 'num_specimen_seen']
df.reindex(columns=columnsNames)
或者,只需使用 sorted
方法对列顺序进行排序:
df = pd.DataFrame({'c_num_legs_2': [2, 4, 8, 0],
'b_num_wings_1': [2, 0, 0, 0],
'a_num_specimen_seen_3': [10, 2, 1, 8]},
index=['falcon', 'dog', 'spider', 'fish'])
cols_reorder = sorted(df.columns, key=lambda col: col.rsplit('_')[-1])
df[cols_reorder]
print(cols_reorder)
# ['b_num_wings_1', 'c_num_legs_2', 'a_num_specimen_seen_3']
print(df.sort_index(axis=1))
a_num_specimen_seen_3 b_num_wings_1 c_num_legs_2
falcon 10 2 2
dog 2 0 4
spider 1 0 8
fish 8 0 0
print(df.sort_index(axis=1, ascending=False))
c_num_legs_2 b_num_wings_1 a_num_specimen_seen_3
falcon 2 2 10
dog 4 0 2
spider 8 0 1
fish 0 0 8
使用方括号更改 pandas 数据框中列的顺序很容易(见下文,我在这里切换了前两列)。但是,我找不到任何有关如何使用方法链执行此操作的信息,这在 R 中使用 dplyr::select()
很容易。例如,我想要这样的东西:df.reorder_columns(["num_wings","num_legs","num_specimen_seen"]),其中"reorder_columns"是编出来的方法。
df = pd.DataFrame({'num_legs': [2, 4, 8, 0],
'num_wings': [2, 0, 0, 0],
'num_specimen_seen': [10, 2, 1, 8]},
index=['falcon', 'dog', 'spider', 'fish'])
df[["num_wings","num_legs","num_specimen_seen"]]
我知道 python 宇宙中有一些 dplyr 复制猫,但我想避免使用这些软件包,因为它们被认为是“前沿”
您使用 .loc
访问器。这同样适用于行和列。
df = (
pd.DataFrame({
'num_legs': [2, 4, 8, 0],
'num_wings': [2, 0, 0, 0],
'num_specimen_seen': [10, 2, 1, 8]
}, index=['falcon', 'dog', 'spider', 'fish'])
.loc[
['dog', 'spider', 'falcon', 'fish'], # rows
["num_wings", "num_legs", "num_specimen_seen"] # columns
]
)
也许你可以尝试这样的事情:
import pandas as pd
df = pd.DataFrame({'num_legs': [2, 4, 8, 0],
'num_wings': [2, 0, 0, 0],
'num_specimen_seen': [10, 2, 1, 8]},
index=['falcon', 'dog', 'spider', 'fish'])
columnsNames = ['num_wings', 'num_legs', 'num_specimen_seen']
df.reindex(columns=columnsNames)
或者,只需使用 sorted
方法对列顺序进行排序:
df = pd.DataFrame({'c_num_legs_2': [2, 4, 8, 0],
'b_num_wings_1': [2, 0, 0, 0],
'a_num_specimen_seen_3': [10, 2, 1, 8]},
index=['falcon', 'dog', 'spider', 'fish'])
cols_reorder = sorted(df.columns, key=lambda col: col.rsplit('_')[-1])
df[cols_reorder]
print(cols_reorder)
# ['b_num_wings_1', 'c_num_legs_2', 'a_num_specimen_seen_3']
print(df.sort_index(axis=1))
a_num_specimen_seen_3 b_num_wings_1 c_num_legs_2
falcon 10 2 2
dog 2 0 4
spider 1 0 8
fish 8 0 0
print(df.sort_index(axis=1, ascending=False))
c_num_legs_2 b_num_wings_1 a_num_specimen_seen_3
falcon 2 2 10
dog 4 0 2
spider 8 0 1
fish 0 0 8