我的输入是这个字典:
response = {
'A': ['CATEGORY 2'],
'B': ['CATEGORY 1', 'CATEGORY 2'],
'C': [],
'D': ['CATEGORY 3'],
}
我正在尝试制作这种数据框:
| ITEM | CATEGORY 1 | CATEGORY 2 | CATEGORY 3 |
| A | | x | |
| B | x | x | |
| C | | | |
| D | | | x |
为此我编写了下面的代码,但结果非常出乎意料。
df = pd.DataFrame.from_dict(response, orient='index').fillna('x')
df = df.reset_index()
df = df.rename(columns={'index': 'ITEM'})
print(df)
ITEM 0 1
0 A CATEGORY 2 x
1 B CATEGORY 1 CATEGORY 2
2 C x x
3 D CATEGORY 3 x
你们有解决方案吗?我愿意接受任何建议。
的问题在于,正在尝试将字典直接转换为数据框,而字典的值具有不同长度的列表。这就是的代码无法按预期工作的原因。
可以使用以下方法来获得所需的数据框:
import pandas as pd
response = {
'A': ['CATEGORY 2'],
'B': ['CATEGORY 1', 'CATEGORY 2'],
'C': [],
'D': ['CATEGORY 3'],
}
# 创建一个空的字典来存储结果
data = {}
# 遍历响应字典
for item, categories in response.items():
data[item] = {category: 1 for category in categories}
# 使用 from_dict 方法从字典创建数据框
df = pd.DataFrame.from_dict(data, orient='index').fillna(0).astype(int)
# 将列名重命名为所需的格式
df = df.rename(columns=lambda x: x.replace("CATEGORY ", "CATEGORY_"))
# 添加 ITEM 列
df = df.reset_index().rename(columns={'index': 'ITEM'})
print(df)
说明:
-
我们首先创建一个空的字典
data
来存储结果。 -
然后,我们遍历
response
字典。对于每个项目及其类别,我们创建一个内部字典,其中类别作为键,值为 1(表示存在)。 -
我们使用
from_dict
方法使用data
字典创建一个数据框,并将其方向设置为index
。 -
我们使用
fillna(0)
将缺失值替换为 0,并使用astype(int)
将所有值转换为整数。 -
我们使用
rename
方法将列名重命名为所需的格式。 -
最后,我们使用
reset_index
方法添加 ITEM 列并将索引重置。
这将为提供所需的数据框输出:
ITEM CATEGORY_1 CATEGORY_2 CATEGORY_3
0 A 0 1 0
1 B 1 1 0
2 C 0 0 0
3 D 0 0 1
标签:python,pandas
From: 78335778