作者:mobiledu2502875315 | 来源:互联网 | 2023-10-10 15:08
我有一个矩阵,其中“一栏”是CSV,如下所示:-
matrix = [
[1,"123,354,23"],[2,"234,34,678"]
]
该如何规范化,因此我在CSV列中为每个值获得一行,即,它看起来像这样:-
[
[1,123],[1,354],23],234],34],678]
]
我愿意使用numpy或pandas。
请注意,在我的特定情况下,还有许多其他非CSV列。
谢谢
在您给出的示例中,将这样做:
matrix = [
[1,"123,354,23"],[2,"234,34,678"]
]
import ast
expanded = [
[ index,item ]
for index,rowString in matrix
for item in ast.literal_eval('[' + rowString + ']')
]
对于其他“非CSV”情况,取决于它们的格式。在这里,ast.literal_eval
是将表观标准(逗号分隔的字符串)转换为变量item
可以迭代的Python序列的好工具。其他格式可能需要其他转换方法。
这将产生与您指定的列表完全相同的列表。 pandas
是一个很好的工具,可以从那里开始使用。然后要将列表转换成pandas.DataFrame
,您可以说:
import pandas as pd
df = pd.DataFrame(expanded,columns=['index','item']).set_index(['index'])
print(df)
# prints:
#
# item
# index
# 1 123
# 1 354
# 1 23
# 2 234
# 2 34
# 2 678
或者,如果用“许多其他非CSV列”表示在矩阵的每一行中任意数量的附加条目,但是最后一个仍然始终是CSV文本,那么它看起来可能像这样: >
matrix = [
[1,3.1415927,'Mary Poppins',2.7182818,'Genghis Khan',678"]
]
import ast
expanded = [
row[:-1] + [item]
for row in matrix
for item in ast.literal_eval('[' + row[-1] + ']')
]
import pandas as pd
df = pd.DataFrame(expanded).set_index([0])
,
如果矩阵包含以下形式的对( first , text ),则可以编写:
result = [
[first,int(rest)]
for first,text in matrix
for rest in text.split(",")]
或者,没有理解列表:
result = []
for first,text in matrix:
for rest in text.split(","):
result.append([first,int(rest)])