[英]Python Sorting elements in a List in pandas Dataframe
我的公司要求我将数据作为列表上传,并附有报价单,这不是最好的,但它就是这样。 例如,如果我有 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 天后遗漏的一些简单的东西,但如果您对如何解决它有任何想法,我将不胜感激。
因为你有字符串,所以首先需要将数据拆分成块。 为此,删除前 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"]'
注意。 这纯粹是先按数字排序,然后按字母数字字符串按单位排序,它没有考虑单位的含义
您可以使用ast.literal_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]
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]
您可以使用eval
来评估字符串:
df['col1'].apply(lambda x: sorted(eval(x)))
但是,通过这种方式,列表按字典顺序排序,因此如果您希望它们按其中包含的数字排序,则必须编写更复杂的函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.