使用基于列

时间:2017-12-15 17:59:33

标签: python pandas dictionary dataframe

我在Python3.x中有以下pandas DataFrame

import pandas as pd

key_dict = {"coordinates": ["AB1", "AB1", "AB1",  "AB1", "AC1", "AC1", "AD1", ...], "start": [762, 23, 75, 98, 1274, 1587, 1991, ...], "end": [2481, 238, 340, 375, 1789, 1689, 2211, ...] }

df = pd.DataFrame(key_dict)

print(df)
  coordinates  start   end
0         AB1    762  2481
1         AB1     23   238
2         AB1     75   340
3         AB1     98   375
4         AC1   1274  1789
5         AC1   1587  1689
6         AD1   1991  2211
...       ...         ...

现在,要将其转换为(嵌套的)字典很简单,例如

my_dict = df.to_dict()
print(my_dict)

{'coordinates': {0: 'AB1', 1: 'AB1', 2: 'AB1', 3: 'AB1', 4: 'AC1', 5: 'AC1', 6: 'AD1'}, 
    'end': {0: 2481, 1: 238, 2: 340, 3: 375, 4: 1789, 5: 1689, 6: 2211}, 
    'start': {0: 762, 1: 23, 2: 75, 3: 98, 4: 1274, 5: 1587, 6: 1991}}

列名是主词典的键,每个索引是子词词典的关键。

我更喜欢嵌套字典coordinates中的唯一元素作为字典键,元素是值。

在上面的例子中,这将是:

{"AB1": {"start": [762, 23, 75, 98], "end":[2481, 238, 340, 375]}, 
    "AC1":{"start": [1274, 1587], "end":[1789, 1689]}, "AD1":{"start": [1991], "end":[2211]}, ...}

不知何故,人们必须删除索引,并忽略第一列。

1 个答案:

答案 0 :(得分:2)

稍微复杂的方法,但可以使用groupby进行一些小数据框整形。

df = df.groupby('coordinates').agg(lambda x: x.values.tolist()).T
df

coordinates                    AB1           AC1     AD1
end          [2481, 238, 340, 375]  [1789, 1689]  [2211]
start            [762, 23, 75, 98]  [1274, 1587]  [1991]
df.to_dict()

{
    "AC1": {
        "start": [
            1274,
            1587
        ],
        "end": [
            1789,
            1689
        ]
    },
    "AD1": {
        "start": [
            1991
        ],
        "end": [
            2211
        ]
    },
    "AB1": {
        "start": [
            762,
            23,
            75,
            98
        ],
        "end": [
            2481,
            238,
            340,
            375
        ]
    }
}