Pandas 数据框到具有自定义格式的字典
Pandas dataframe to dictionary with custom format
我正在尝试将 pandas 数据帧转换为字典,但我需要指定的输出格式,我一直在阅读和审查许多其他答案,但我无法解决;我的数据框看起来像:
label Min Max Prom Desv. Est. Cr Tz Cpk Zup Zlow PPM % OOS # Datos
0 test1 1.25 1.46 1.329 0.0426 1.161 -0.023 0.697 2.090 3.077 19354 2 268
1 test2 4.80 5.50 5.110 0.1368 0.774 -1.097 0.926 2.778 4.972 2735 0 268
2 test3 2.58 2.96 2.747 0.0709 0.760 -1.029 0.973 2.918 4.977 1762 0 268
我试过这个(和其他选项,但这与期望输出最相似):
dict = df.set_index('label').groupby('label').apply(lambda g: g.values.tolist()).to_dict()
我得到了:
{'test1': [[1.25, 1.46, 1.329, 0.0426, 1.161, -0.023, 0.697, 2.09, 3.077, 19354.0, 2.0, 268.0]],
'test2': [[4.8, 5.5, 5.11, 0.1368, 0.774, -1.097, 0.926, 2.778, 4.972, 2735.0, 0.0, 268.0]],
'test3': [[2.58, 2.96, 2.747, 0.0709, 0.76, -1.0290, 0.973, 2.918, 4.977, 1762.0, 0.0, 268.0]]}
但我正在寻找的是:
{'label':'test1', 'cols':[1.25, 1.46, 1.329, 0.0426, 1.161, -0.023, 0.697, 2.09, 3.077, 19354.0, 2.0, 268.0]},
{'label':'test2', 'cols': [4.8, 5.5, 5.11, 0.1368, 0.774, -1.097, 0.926, 2.778, 4.972, 2735.0, 0.0, 268.0]},
{'label':'test3', 'cols': [2.58, 2.96, 2.747, 0.0709, 0.76, -1.0290, 0.973, 2.918, 4.977, 1762.0, 0.0, 268.0]}
非常感谢任何想法或建议。
您可以使用 lambda 函数构建您想要的输出:
df.apply(lambda x: {'label':x.label, 'cols': x.tolist()[1:]}, axis=1).tolist()
好吧,从字面上看你的问题标题,总有 .to_dict():
>>> df = pd.DataFrame([dict(a=1, b=2), dict(a=3, b=4), dict(a=5, b=6)])
>>> df
a b
0 1 2
1 3 4
2 5 6
>>> df.to_dict()
{'a': {0: 1, 1: 3, 2: 5}, 'b': {0: 2, 1: 4, 2: 6}}
但是你的例子表明你正在寻找一个 list 的字典,
可以方便地由 iterrows or itertuples:
生成
>>> df = pd.DataFrame([dict(a=1, b=2), dict(a=3, b=4), dict(a=5, b=6)])
>>> df
a b
0 1 2
1 3 4
2 5 6
>>>
>>> for i, row in df.iterrows():
... print(dict(row), list(row))
...
{'a': 1, 'b': 2} [1, 2]
{'a': 3, 'b': 4} [3, 4]
{'a': 5, 'b': 6} [5, 6]
>>>
>>> for row in df.itertuples(index=False):
... print(dict(row._asdict()))
...
{'a': 1, 'b': 2}
{'a': 3, 'b': 4}
{'a': 5, 'b': 6}
使用 list(row)[1:]
跳过标签,可能符合您的要求。
我正在尝试将 pandas 数据帧转换为字典,但我需要指定的输出格式,我一直在阅读和审查许多其他答案,但我无法解决;我的数据框看起来像:
label Min Max Prom Desv. Est. Cr Tz Cpk Zup Zlow PPM % OOS # Datos
0 test1 1.25 1.46 1.329 0.0426 1.161 -0.023 0.697 2.090 3.077 19354 2 268
1 test2 4.80 5.50 5.110 0.1368 0.774 -1.097 0.926 2.778 4.972 2735 0 268
2 test3 2.58 2.96 2.747 0.0709 0.760 -1.029 0.973 2.918 4.977 1762 0 268
我试过这个(和其他选项,但这与期望输出最相似):
dict = df.set_index('label').groupby('label').apply(lambda g: g.values.tolist()).to_dict()
我得到了:
{'test1': [[1.25, 1.46, 1.329, 0.0426, 1.161, -0.023, 0.697, 2.09, 3.077, 19354.0, 2.0, 268.0]],
'test2': [[4.8, 5.5, 5.11, 0.1368, 0.774, -1.097, 0.926, 2.778, 4.972, 2735.0, 0.0, 268.0]],
'test3': [[2.58, 2.96, 2.747, 0.0709, 0.76, -1.0290, 0.973, 2.918, 4.977, 1762.0, 0.0, 268.0]]}
但我正在寻找的是:
{'label':'test1', 'cols':[1.25, 1.46, 1.329, 0.0426, 1.161, -0.023, 0.697, 2.09, 3.077, 19354.0, 2.0, 268.0]},
{'label':'test2', 'cols': [4.8, 5.5, 5.11, 0.1368, 0.774, -1.097, 0.926, 2.778, 4.972, 2735.0, 0.0, 268.0]},
{'label':'test3', 'cols': [2.58, 2.96, 2.747, 0.0709, 0.76, -1.0290, 0.973, 2.918, 4.977, 1762.0, 0.0, 268.0]}
非常感谢任何想法或建议。
您可以使用 lambda 函数构建您想要的输出:
df.apply(lambda x: {'label':x.label, 'cols': x.tolist()[1:]}, axis=1).tolist()
好吧,从字面上看你的问题标题,总有 .to_dict():
>>> df = pd.DataFrame([dict(a=1, b=2), dict(a=3, b=4), dict(a=5, b=6)])
>>> df
a b
0 1 2
1 3 4
2 5 6
>>> df.to_dict()
{'a': {0: 1, 1: 3, 2: 5}, 'b': {0: 2, 1: 4, 2: 6}}
但是你的例子表明你正在寻找一个 list 的字典, 可以方便地由 iterrows or itertuples:
生成>>> df = pd.DataFrame([dict(a=1, b=2), dict(a=3, b=4), dict(a=5, b=6)])
>>> df
a b
0 1 2
1 3 4
2 5 6
>>>
>>> for i, row in df.iterrows():
... print(dict(row), list(row))
...
{'a': 1, 'b': 2} [1, 2]
{'a': 3, 'b': 4} [3, 4]
{'a': 5, 'b': 6} [5, 6]
>>>
>>> for row in df.itertuples(index=False):
... print(dict(row._asdict()))
...
{'a': 1, 'b': 2}
{'a': 3, 'b': 4}
{'a': 5, 'b': 6}
使用 list(row)[1:]
跳过标签,可能符合您的要求。