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')