csv Python pandas DataFrame:将数据从字典传输到右侧单元格

4ktjp1zp  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(93)

你能告诉我如何使用交叉匹配将数据从字典转移到表中吗?例如,有一个字典,其中每个项目都有自己的组件集,还有一个表,其中列是项目,行是组件。
我需要把字典中的每个项目,并检查表中的每个组件。如果项目中有这样的组件,那么在正确的单元格中放入X
构件不是唯一的,它们可以在其他项目中重复。项目和组件具有不同的编号。

示例:

project_components = {'Project_1': ['component_1', 'component_2', 'component_3', 'component_4'], 
'Project_2': ['component_2', 'component_3'], 
'Project_3': ['component_3', 'component_4'], 
'Project_4': ['component_2'], ...}

Template.csv
|组件/项目| 项目_1|项目_2|项目_3|项目_4|项目_N →→|
| --|--|--|--|--|--|
| 组件_1||||||
| 组件_2||||||
| 组件_3||||||
| 组件_4||||||
| 组件_N ↓||||||

结果:

|组件/项目| 项目_1|项目_2|项目_3|项目_4|项目_N →→|
| --|--|--|--|--|--|
| 组件_1| X|||||
| 组件_2| X| X||X||
| 组件_3| X| X| X|||
| 组件_4| X||X|||
| component_N ↓||||||
我知道iterrows(),但不知道如何将其与循环字典结合起来,并将值放入正确的单元格并将其保存为CSV。

def read_csv():
    data = pd.read_csv("Template.csv") 
  
    for row in data.iterrows():
        print(row)

read_csv()

添加Template.csv

Component / Project; Project_1; Project_2; Project_3; Project_4;Project_N;
component_1;
component_2;
component_3;
component_4;
component_N;
ujv3wf0j

ujv3wf0j1#

您可以直接从字典创建输出,而无需模板:

out = pd.DataFrame({k: {k2: 'X' for k2 in l} for k, l in
                    project_components.items()})

如果你真的有一个带有特定索引/列的模板,你可以reindex_like它:

out = out.reindex_like(template)

输出量:

Project_1 Project_2 Project_3 Project_4
component_1         X       NaN       NaN       NaN
component_2         X         X       NaN         X
component_3         X         X         X       NaN
component_4         X       NaN         X       NaN

如果你真的想循环并修改模板:

template = pd.read_csv('Template.csv', sep=';', skipinitialspace=True,
                       index_col=0, dtype='str',
                       usecols=lambda x: not x.startswith('Unnamed:')
                       ).fillna('')

for k, l in project_components.items():
    if k not in template:
        print(f'"{k}" not found')
    template.loc[l, k] = 'X'
    
print(template)

template.to_csv('Output.csv', sep=';')

输出量:

Project_1 Project_2 Project_3 Project_4 Project_N
Component / Project                                                  
component_1                 X                                        
component_2                 X         X                   X          
component_3                 X         X         X                    
component_4                 X                   X                    
component_N

CSV:

Component / Project;Project_1;Project_2;Project_3;Project_4;Project_N
component_1;X;;;;
component_2;X;X;;X;
component_3;X;X;X;;
component_4;X;;X;;
component_N;;;;;
  • 注意,这里我假设Component / Project索引。*

相关问题