Python 将数据帧的索引设置为字典中的单个键
我有一个数据帧,例如:Python 将数据帧的索引设置为字典中的单个键,python,pandas,dictionary,dataframe,Python,Pandas,Dictionary,Dataframe,我有一个数据帧,例如: df = {'index': [0, 0, 0, 0, 0, 1,1,1,1,1, 2,2,2,2], 'value': ['val1', 'val2', 'val3', 'val4', 'val5', 'val6','val7','val8','val9','val10', 'val11','val12','val13','val14']} 我希望得到一个字典,其中每个索引都将成为我字典中的一个键,以便: 键=0,值=['val1','val2','val3','va
df = {'index': [0, 0, 0, 0, 0, 1,1,1,1,1, 2,2,2,2], 'value': ['val1', 'val2', 'val3', 'val4', 'val5', 'val6','val7','val8','val9','val10', 'val11','val12','val13','val14']}
我希望得到一个字典,其中每个索引都将成为我字典中的一个键,以便:
键=0,值=['val1','val2','val3','val4','val5']
知道怎么做吗?我一直在使用“to_dict”,但看起来我没有做我需要做的事情。我可以想出如下方法:
import pandas as pd
df = pd.DataFrame({'index': [0, 0, 0, 0, 0, 1,1,1,1,1, 2,2,2,2], 'value': ['val1', 'val2', 'val3', 'val4', 'val5', 'val6','val7','val8','val9','val10', 'val11','val12','val13','val14']})
df.groupby(by='index').apply(lambda x: list(x['value'])).to_dict()
输出为:
{0: ['val1', 'val2', 'val3', 'val4', 'val5'],
1: ['val6', 'val7', 'val8', 'val9', 'val10'],
2: ['val11', 'val12', 'val13', 'val14']}
我能想到这样的事情:
import pandas as pd
df = pd.DataFrame({'index': [0, 0, 0, 0, 0, 1,1,1,1,1, 2,2,2,2], 'value': ['val1', 'val2', 'val3', 'val4', 'val5', 'val6','val7','val8','val9','val10', 'val11','val12','val13','val14']})
df.groupby(by='index').apply(lambda x: list(x['value'])).to_dict()
输出为:
{0: ['val1', 'val2', 'val3', 'val4', 'val5'],
1: ['val6', 'val7', 'val8', 'val9', 'val10'],
2: ['val11', 'val12', 'val13', 'val14']}
使用
groupby
和apply
,然后是最后一个命令
调用
df.groupby('index').value.apply(list).to_dict()
# {0: ['val1', 'val2', 'val3', 'val4', 'val5'],
# 1: ['val6', 'val7', 'val8', 'val9', 'val10'],
# 2: ['val11', 'val12', 'val13', 'val14']}
另一个选项是使用
setdefault
在行上迭代并附加到字典中的值
d = {}
for k, v in zip(df['index'], df.value):
d.setdefault(k, []).append(v)
print(d)
# {0: ['val1', 'val2', 'val3', 'val4', 'val5'],
# 1: ['val6', 'val7', 'val8', 'val9', 'val10'],
# 2: ['val11', 'val12', 'val13', 'val14']}
我的测试表明,对于中等大小的帧,这实际上比
groupby
的性能要好。这也将保留值顺序,同时groupby
执行排序(是否稳定是一个实现细节)。使用groupby
和apply
,然后是最后的to dict
调用
df.groupby('index').value.apply(list).to_dict()
# {0: ['val1', 'val2', 'val3', 'val4', 'val5'],
# 1: ['val6', 'val7', 'val8', 'val9', 'val10'],
# 2: ['val11', 'val12', 'val13', 'val14']}
另一个选项是使用
setdefault
在行上迭代并附加到字典中的值
d = {}
for k, v in zip(df['index'], df.value):
d.setdefault(k, []).append(v)
print(d)
# {0: ['val1', 'val2', 'val3', 'val4', 'val5'],
# 1: ['val6', 'val7', 'val8', 'val9', 'val10'],
# 2: ['val11', 'val12', 'val13', 'val14']}
我的测试表明,对于中等大小的帧,这实际上比
groupby
的性能要好。这也将保留值排序,同时groupby
执行排序(是否稳定是一个实现细节)。使用itertools
import itertools
l=df.sort_values('index').values.tolist()
d={k: [x[1] for x in g] for k, g in itertools.groupby(l,lambda x : x[0])}
d
{0: ['val1', 'val2', 'val3', 'val4', 'val5'], 1: ['val6', 'val7', 'val8', 'val9', 'val10'], 2: ['val11', 'val12', 'val13', 'val14']}
使用
itertools
import itertools
l=df.sort_values('index').values.tolist()
d={k: [x[1] for x in g] for k, g in itertools.groupby(l,lambda x : x[0])}
d
{0: ['val1', 'val2', 'val3', 'val4', 'val5'], 1: ['val6', 'val7', 'val8', 'val9', 'val10'], 2: ['val11', 'val12', 'val13', 'val14']}
非常感谢。我现在想将其转储到一个json文件中,但我的密钥现在被解释为int,并且需要是字符串。我该怎么做?您可以执行
导入json
,然后执行json.dumps(var1)
。应该是类似于“”{“0”:[“val1”、“val2”、“val3”、“val4”、“val5”],“1”:[“val6”、“val7”、“val8”、“val9”、“val10”],“2”:[“val11”、“val12”、“val13”、“val14”]}
谢谢。我现在想将其转储到一个json文件中,但我的密钥现在被解释为int,并且需要是字符串。我该怎么做?您可以执行导入json
,然后执行json.dumps(var1)
。应该是类似于“”{“0”:[“val1”、“val2”、“val3”、“val4”、“val5”]、“1”:[“val6”、“val7”、“val8”、“val9”、“val10”]、“2”:[“val11”、“val12”、“val13”、“val14”]}
查找alt:-)~查找alt:-)~