Python Pandas - 从 CSV 生成矩阵
Python Pandas - Matrix Generation From CSV
Pandas 的初学者,但我认为它是正确的工具。
我有一个如下所示的 CSV 文件,显示了 Source/Destination/Value:
之间的关系
Source
Destination
Value
Item1
Item1
true
Item1
Item2
true
Item2
Item1
false
Item2
Item2
true
(有几千个“项目”)
最终目标是实现 CSV,例如:
Item1
Item2
Item3
Item4
Item1
true
true
false
false
Item2
true
false
true
true
我生成了一个包含行 Headers 和列 Headers 的新 CSV,但是,我不确定如何填写值元素。
我如何读取 CSV 以维持 Source/Dest/Value 和输出到 CSV 之间的关系?
生成新 CSV 的当前代码:
df = pd.read_csv('Input.csv')
unique = df['Source'].unique()
unique.sort()
headers = [x for x in unique]
outfile = open("newcsv.csv",'w+', newline='')
writer = csv.writer(outfile,delimiter = ',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
writer.writerow([" "] + headers)
for item in headers:
writer.writerow([item])
可供您选择的选项很少。您可以使用 pivot
(示例已在评论中)或 pivot_table
。它们的不同之处在于 pivot_table
可以处理旋转列的重复值,因此如果您确实有再次显示相同关系的行,请使用它。
代码可以是这样的:
df = pd.read_csv('Input.csv')
res = df.pivot_table(values='Value', index='Source', columns='Destination',aggfunc=max)
# without aggfunc, you get 0 and 1 as result, you can also go with "any" for example.
# if duplicate rows with different value in "Value" then you can decide about how these values gets aggregated.
res.to_csv('Output.csv')
其他可能性是 pd.crosstab
(您还必须在此处选择 aggfunc)或
我认为 pandas 'pivot' 可以帮到你。
df = pd.read_csv("./source-def.csv", sep="\t")
df_op = df.pivot(index='Source', columns='Destination', values='Value').fillna(False)
df_op.head()
Destination
Item1
Item2
Item3
Item4
Source
Item1
True
True
False
False
Item2
False
True
True
True
最后,您可以像这样使用'to_csv'将文件再次写入另一个CSV文件。
df_op.to_csv('pivot.csv')
Pandas 的初学者,但我认为它是正确的工具。
我有一个如下所示的 CSV 文件,显示了 Source/Destination/Value:
之间的关系Source | Destination | Value |
---|---|---|
Item1 | Item1 | true |
Item1 | Item2 | true |
Item2 | Item1 | false |
Item2 | Item2 | true |
(有几千个“项目”)
最终目标是实现 CSV,例如:
Item1 | Item2 | Item3 | Item4 | |
---|---|---|---|---|
Item1 | true | true | false | false |
Item2 | true | false | true | true |
我生成了一个包含行 Headers 和列 Headers 的新 CSV,但是,我不确定如何填写值元素。
我如何读取 CSV 以维持 Source/Dest/Value 和输出到 CSV 之间的关系?
生成新 CSV 的当前代码:
df = pd.read_csv('Input.csv')
unique = df['Source'].unique()
unique.sort()
headers = [x for x in unique]
outfile = open("newcsv.csv",'w+', newline='')
writer = csv.writer(outfile,delimiter = ',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
writer.writerow([" "] + headers)
for item in headers:
writer.writerow([item])
可供您选择的选项很少。您可以使用 pivot
(示例已在评论中)或 pivot_table
。它们的不同之处在于 pivot_table
可以处理旋转列的重复值,因此如果您确实有再次显示相同关系的行,请使用它。
代码可以是这样的:
df = pd.read_csv('Input.csv')
res = df.pivot_table(values='Value', index='Source', columns='Destination',aggfunc=max)
# without aggfunc, you get 0 and 1 as result, you can also go with "any" for example.
# if duplicate rows with different value in "Value" then you can decide about how these values gets aggregated.
res.to_csv('Output.csv')
其他可能性是 pd.crosstab
(您还必须在此处选择 aggfunc)或
我认为 pandas 'pivot' 可以帮到你。
df = pd.read_csv("./source-def.csv", sep="\t")
df_op = df.pivot(index='Source', columns='Destination', values='Value').fillna(False)
df_op.head()
Destination | Item1 | Item2 | Item3 | Item4 |
---|---|---|---|---|
Source | ||||
Item1 | True | True | False | False |
Item2 | False | True | True | True |
最后,您可以像这样使用'to_csv'将文件再次写入另一个CSV文件。
df_op.to_csv('pivot.csv')