我的公司要求我將資料作為串列上傳,并附有報價單,這不是最好的,但它就是這樣。例如,如果我有 2 英寸和 3 英寸的資料,我必須將其上傳為 ["2 in", "3 in"]。
當我嘗試對每一行的串列中的元素進行排序時,我得到了這個: [1, 2, , ", ", [, ], o, z] 其中它對每個單獨的字母和數字進行排序
Example of the DF I am trying to sort:
d = {'col1': ['["3 oz","1 oz","2 oz"]', '["1.2 in","1 in","1.3 in"]', '["10 in","22 in","3.4 in"]']}
df = pd.DataFrame(data=d)
我嘗試過的:
def sorted_alphanumeric(data):
convert = lambda text: int(text) if text.isdigit() else text.lower()
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9] )', key) ]
return sorted(data, key=alphanum_key)
df['col1'].apply(lambda x: sorted_alphanumeric((x)))
and
from natsort import natsorted
df['col1'].apply(lambda x: natsorted(x))
and
df['col1'].apply(lambda x: sorted(x))
我確信這是我在盯著這個看了 2 天后遺漏的一些簡單的東西,但如果您對如何解決它有任何想法,我將不勝感激。
uj5u.com熱心網友回復:
因為你有字串,所以首先需要將資料拆分成塊。為此洗掉前 2 個和最后 2 個字符["ad "],然后拆分","以獲取資料串列。
這是使用 apply 的一種方法:
from natsort import natsorted
(df['col1'].str[2:-2].str.split('","')
.apply(lambda x: '["' '","'.join(natsorted(x)) '"]')
)
輸出(作為一個系列):
0 ["1 oz","2 oz","3 oz"]
1 ["1 in","1.2 in","1.3 in"]
2 ["3.4 in","10 in","22 in"]
Name: col1, dtype: object
為明確起見,專案是字串: '["1 oz","2 oz","3 oz"]'
注意。這純粹是先按數字排序,然后按字母數字字串按單位排序,它沒有考慮單位的含義
uj5u.com熱心網友回復:
from natsort import natsorted
df['col1'] = df['col1'].apply(lambda x: natsorted(eval(x)))
print(df)
col1
0 [1 oz, 2 oz, 3 oz]
1 [1 in, 1.2 in, 1.3 in]
2 [3.4 in, 10 in, 22 in]
uj5u.com熱心網友回復:
您可以使用eval來評估字串:
df['col1'].apply(lambda x: sorted(eval(x)))
但是,通過這種方式,串列按字典順序排序,因此如果您希望它們按其中包含的數字排序,則必須撰寫更復雜的函式。
uj5u.com熱心網友回復:
您可以使用ast.literal_evalthen 排序,如下所示:
(為什么使用literal_eval而不是使用eval)
>>> from ast import literal_eval
>>> df['col1'] = df['col1'].apply(lambda x: sorted(literal_eval(x)))
>>> df
col1
0 [1 oz, 2 oz, 3 oz]
1 [1 in, 1.2 in, 1.3 in]
2 [10 in, 22 in, 3.4 in]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/349344.html
上一篇:使用外鍵字串執行遷移時出錯
