我正在尝试从pandas数据框生成字典。具体来说,我需要:
采用第一(x)列,并将其每一行中的数据点一起用作键。
使用该行中的其余数据点作为值和列表,为每个键编译一个字典。
为了简单起见,我们使用此示例数据框。
df = pd.DataFrame([
{'c1':a1, 'c2':110, 'c3':'xyz', 'c4':24},
{'c1':b2,'c2':100, 'c3':'jdf', 'c4':15},
{'c1':a1,'c2':110, 'c3':'kjl', 'c4':125},
{'c1':b2, 'c2':100, 'c3':'abc', 'c4':71},
])
c1 c2 c3 c4
0 a1 110 xyz 24
1 b2 100 jdf 15
2 a1 110 kjl 125
3 b2 100 abc 71
new_dict = some code
new_dict
{('a1', 110): [['xyz', 24], ['kjl', 125]], ('b2', 100): [['jdf', 15], ['abc', 71]]}
我尝试了很多事情,包括为键创建元组列表列表,将唯一列表作为键分配给新词典(值空列表),但是我无法填充值。
我能够以单列作为关键字,并根据需要编辑其他所有内容,例如:
test_dict = {}
for index, row in df.iterrows():
if row['c1'] in test_dict:
test_dict[row['c1']].append([row['c2'], row['c3'], row['c4']])
else:
test_dict[row['c1']] = []
test_dict[row['c1']].append([row['c2'], row['c3'], row['c4']])
但是我不能跳到组合多列作为关键。
答案 0 :(得分:1)
假定以下数据框:
import pandas as pd
df = pd.DataFrame([
{'c1': 'a1', 'c2': 110, 'c3': 'xyz', 'c4': 24},
{'c1': 'b2', 'c2': 100, 'c3': 'jdf', 'c4': 15},
{'c1': 'a1', 'c2': 110, 'c3': 'kjl', 'c4': 125},
{'c1': 'b2', 'c2': 100, 'c3': 'abc', 'c4': 71},
])
您可以groupby,进行汇总,然后转换为字典(to_dict):
groups = df.groupby(['c1', 'c2']).apply(lambda x: x[['c3', 'c4']].values.tolist()).to_dict()
print(groups)
输出
{('a1', 110): [['xyz', 24], ['kjl', 125]], ('b2', 100): [['jdf', 15], ['abc', 71]]}
答案 1 :(得分:0)
test_dict = {}
for index, row in df.iterrows():
if (row['c1'], row['c2']) in test_dict:
test_dict[(row['c1'], row['c2'])].append([row['c3'], row['c4']])
else:
test_dict[(row['c1'], row['c2'])] = [[row['c3'], row['c4']]]
test_dict
{('a1', 100): [['xyz', 24], ['kjl', 125]], ('b2', 110): [['jdf', 15], ['abc', 71]]}
答案 2 :(得分:0)
您可以尝试以下groupby
:
(df.groupby(['c1','c2'])
.apply(lambda x: x[['c3','c4']].values)
.to_dict()
)
输出:
{('a1', 110): array([['xyz', 24],
['kjl', 125]], dtype=object), ('b2', 100): array([['jdf', 15],
['abc', 71]], dtype=object)}
答案 3 :(得分:0)
您用于创建数据框的数据与您作为示例显示的数据框不匹配,但是您似乎想要的可以通过以下方式完成:
x = 2
key_cols = list(df.columns[:x])
value_cols = df.columns[x:]
new_dict = df.groupby(key_cols).apply(lambda sub_df: sub_df[value_cols].values.tolist()).to_dict()