如何将Entry类属性按列对应行写入Pandas DataFrame?
问题描述
我定义了Entry类,包含column、task、desc、member、timeline字符串属性。需求是将每个Entry实例的属性写入Pandas DataFrame对应列:column指定列名,其余4个属性填入该列的连续4行。
当前实现的问题是:添加新列的Entry时,其属性会追加在之前列的索引之后,导致各列内容错位。错误输出如下:
| index | column 1 | column 2 | column 3 | column 4 |
|---|---|---|---|---|
| 0 | Task: text | NaN | NaN | NaN |
| 1 | Description: text | NaN | NaN | NaN |
| 2 | Assigned Member: text | NaN | NaN | NaN |
| 3 | Timeline: text | NaN | NaN | NaN |
| 4 | NaN | Task: text | NaN | NaN |
| 5 | NaN | Description: text | NaN | NaN |
| 6 | NaN | Assigned Member: text | NaN | NaN |
| 7 | NaN | Timeline: text | NaN | NaN |
| 8 | NaN | NaN | Task: text | NaN |
| 9 | NaN | NaN | Description: text | NaN |
| 10 | NaN | NaN | Assigned Member: text | NaN |
| 11 | NaN | NaN | Timeline: text | NaN |
| 12 | NaN | NaN | NaN | Task: text |
| 13 | NaN | NaN | NaN | Description: text |
| 14 | NaN | NaN | NaN | Assigned Member: text |
| 15 | NaN | NaN | NaN | Timeline: text |
初始代码:
import pandas as pd class Entry: def __init__(self, column, task, desc, member, timeline): self.column = column self.task = f"Task: {task}" self.desc = f"Description: {desc}" self.member = f"Assigned Member: {member}" self.timeline = f"Timeline: {timeline}" def enter_entries(df, entries): for entry in entries: df = df._append({entry.column: entry.task}, ignore_index=True) df = df._append({entry.column: entry.desc}, ignore_index=True) df = df._append({entry.column: entry.member}, ignore_index=True) df = df._append({entry.column: entry.timeline}, ignore_index=True) return df # Create the DataFrame df = pd.DataFrame(columns=['column 1', 'column 2', 'column 3', 'column 4']) #Backlog Entry entry = Entry('column 1', 'text', 'text', 'text', 'text') #Doing Entry entry2 = Entry('column 2', 'text', 'text', 'text', 'text') #Review Entry entry3 = Entry('column 3', 'text', 'text', 'text', 'text') #Done Entry entry4 = Entry('column 4', 'text', 'text', 'text', 'text') #Add each entry to the entries list entries = [entry, entry2, entry3, entry4] df = enter_entries(df, entries) display(df)
解决方法
原代码中_append会逐行新增记录,导致每列内容依次向后堆叠,无法对齐。需要改为为每个列一次性填充4行数据。
方案1:直接构造数据字典生成DataFrame
这是最简洁的方式,先将所有Entry的属性整理为字典(键为列名,值为属性列表),再生成DataFrame:
import pandas as pd class Entry: def __init__(self, column, task, desc, member, timeline): self.column = column self.task = f"Task: {task}" self.desc = f"Description: {desc}" self.member = f"Assigned Member: {member}" self.timeline = f"Timeline: {timeline}" # 初始化Entry实例 entry = Entry('column 1', 'text', 'text', 'text', 'text') entry2 = Entry('column 2', 'text', 'text', 'text', 'text') entry3 = Entry('column 3', 'text', 'text', 'text', 'text') entry4 = Entry('column 4', 'text', 'text', 'text', 'text') entries = [entry, entry2, entry3, entry4] # 构造数据字典 data = {} for entry in entries: data[entry.column] = [entry.task, entry.desc, entry.member, entry.timeline] # 创建并展示DataFrame df = pd.DataFrame(data) display(df)
方案2:修改现有填充逻辑(保留空DataFrame初始化)
如果需要保留初始的空DataFrame结构,可通过指定行索引来填充对应列的内容:
import pandas as pd class Entry: def __init__(self, column, task, desc, member, timeline): self.column = column self.task = f"Task: {task}" self.desc = f"Description: {desc}" self.member = f"Assigned Member: {member}" self.timeline = f"Timeline: {timeline}" def enter_entries(df, entries): row_count = 4 # 每个列固定4行内容 for entry in entries: # 按行索引依次填充对应属性 df.loc[0, entry.column] = entry.task df.loc[1, entry.column] = entry.desc df.loc[2, entry.column] = entry.member df.loc[3, entry.column] = entry.timeline return df # 初始化指定4行的空DataFrame df = pd.DataFrame(index=range(4), columns=['column 1', 'column 2', 'column 3', 'column 4']) # 初始化Entry实例 entry = Entry('column 1', 'text', 'text', 'text', 'text') entry2 = Entry('column 2', 'text', 'text', 'text', 'text') entry3 = Entry('column 3', 'text', 'text', 'text', 'text') entry4 = Entry('column 4', 'text', 'text', 'text', 'text') entries = [entry, entry2, entry3, entry4] df = enter_entries(df, entries) display(df)
最终效果
两种方案都会生成对齐的DataFrame:
| index | column 1 | column 2 | column 3 | column 4 |
|---|---|---|---|---|
| 0 | Task: text | Task: text | Task: text | Task: text |
| 1 | Description: text | Description: text | Description: text | Description: text |
| 2 | Assigned Member: text | Assigned Member: text | Assigned Member: text | Assigned Member: text |
| 3 | Timeline: text | Timeline: text | Timeline: text | Timeline: text |
内容的提问来源于stack exchange,提问作者GioM
相关产品推荐
相关产品推荐

