在 Python 中对具有不规则列信息的 table 进行排序
Sort a table with irregular column info in Python
我有一个乱七八糟的 table,如下所示,table 中的数据有整数和 word/character。
我想将 table 从 Info 5 排序为 Info 1.
Fruit
Info 1
Info 2
Info 3
Info 4
Info 5
Apple
q
z
2
Grape
w
4
Guava
e
7
u
Kiwi
r
n
s
m
希望得到如下结果table。
Fruit
Info 1
Info 2
Info 3
Info 4
Info 5
Kiwi
r
n
s
m
Guava
e
7
u
Apple
q
z
2
Grape
w
4
我曾尝试使用 str.contains,但它无法检测到整数。
i = ['Fruit', 'Info 1', 'Info 2', 'Info 3', 'Info 4', 'Info 5',]
data[data[i].str.contains('', na=False)
我的解决方案是使用旧 5 列的数字映射创建新的 5 列。这样更容易排序。关键函数是map
,还有其他等价物如replace
# Step 1/3: create a dictionary to convert alphabet & 0-9 to new number value only:
convert_dict = {'a':1,
'b':2,
'c':3} # You can start filling till z. Then for 0-9 accumulate
# Step 2/3: iterate over 5 columns, create 5 `new {i}` columns that can be used for sort:
for i in range(1,6):
df[f'new {i}'] = df[f'Info {i}'].map(convert_dict)
# Step 3/3: sort
df.sort_values(by=[f'new {i}' for i in range(1,6)], ignore_index=True, inplace=True)
df.drop(columns=[f'new {i}' for i in range(1,6)], inplace=True) # remove if you no longer need
我有一个乱七八糟的 table,如下所示,table 中的数据有整数和 word/character。 我想将 table 从 Info 5 排序为 Info 1.
Fruit | Info 1 | Info 2 | Info 3 | Info 4 | Info 5 |
---|---|---|---|---|---|
Apple | q | z | 2 | ||
Grape | w | 4 | |||
Guava | e | 7 | u | ||
Kiwi | r | n | s | m |
希望得到如下结果table。
Fruit | Info 1 | Info 2 | Info 3 | Info 4 | Info 5 |
---|---|---|---|---|---|
Kiwi | r | n | s | m | |
Guava | e | 7 | u | ||
Apple | q | z | 2 | ||
Grape | w | 4 |
我曾尝试使用 str.contains,但它无法检测到整数。
i = ['Fruit', 'Info 1', 'Info 2', 'Info 3', 'Info 4', 'Info 5',]
data[data[i].str.contains('', na=False)
我的解决方案是使用旧 5 列的数字映射创建新的 5 列。这样更容易排序。关键函数是map
,还有其他等价物如replace
# Step 1/3: create a dictionary to convert alphabet & 0-9 to new number value only:
convert_dict = {'a':1,
'b':2,
'c':3} # You can start filling till z. Then for 0-9 accumulate
# Step 2/3: iterate over 5 columns, create 5 `new {i}` columns that can be used for sort:
for i in range(1,6):
df[f'new {i}'] = df[f'Info {i}'].map(convert_dict)
# Step 3/3: sort
df.sort_values(by=[f'new {i}' for i in range(1,6)], ignore_index=True, inplace=True)
df.drop(columns=[f'new {i}' for i in range(1,6)], inplace=True) # remove if you no longer need