Python Pandas - 从字典创建新字典&柱

时间:2018-04-01 16:08:08

标签: python pandas dictionary dataframe

在Pandas,我的一个专栏" ID_Name"由一系列字典组成,格式如下:

[{'id': 10, 'name': 'Anna'}, {'id': 15, 'name': 'Bob'}, {'id': 20, 'name': 'Charlie'}, {'id': 25, 'name': 'Donald'} ] 

另外,我有一个名为" AVG_INCOME"的平均收入列。让我们说这四个人的平均收入是100000.

如何使用以下格式创建新的词典列表:

[{'Anna': '100000' }, {'Bob': '100000' }, {'Charlie': '100000' }, {'Donald': '100000'}] 

4 个答案:

答案 0 :(得分:0)

您的数据框设置方式:

   AVG_INCOME                           ID_Name
0       10000     {u'id': 10, u'name': u'Anna'}
1       10000      {u'id': 15, u'name': u'Bob'}
2       10000  {u'id': 20, u'name': u'Charlie'}
3       10000   {u'id': 25, u'name': u'Donald'}

虽然在数据框中的列中包含字典会让人感到困惑和低效。我就是这样做的:

import pandas as pd

id_name = [{'id': 10, 'name': 'Anna'},
           {'id': 15, 'name': 'Bob'},
           {'id': 20, 'name': 'Charlie'},
           {'id': 25, 'name': 'Donald'}]

avg_income = [10000] * 4

df = pd.DataFrame(id_name)
df['AVG_INCOME'] = pd.Series(avg_income)
print df

输出:

   id     name  AVG_INCOME
0  10     Anna       10000
1  15      Bob       10000
2  20  Charlie       10000
3  25   Donald       10000

完成数据框设置后所需的代码行

print dict(zip(df['name'], df['AVG_INCOME']))
# {'Charlie': 10000L, 'Bob': 10000L, 'Donald': 10000L, 'Anna': 10000L}

答案 1 :(得分:0)

一种方法是使用pd.Series.maplambda函数来提取名称。

然后使用dict(zip(keys, values))构造来创建词典。

df = pd.DataFrame({'ID_Name': [{'id': 10, 'name': 'Anna'},
                               {'id': 15, 'name': 'Bob'},
                               {'id': 20, 'name': 'Charlie'},
                               {'id': 25, 'name': 'Donald'}],
                   'AVG_INCOME': [10000]*4})

res = dict(zip(df['ID_Name'].map(lambda x: x['name']), df['AVG_INCOME']))

# {'Anna': 10000, 'Bob': 10000, 'Charlie': 10000, 'Donald': 10000}

但是,您应该尝试重构构建数据框的方式。例如,如果您有json输入,则应该可以为id添加一列,为name添加一列。使用带有数据帧的字典效率很低。

答案 2 :(得分:-1)

尝试下面,其中数据是DF的名称

.matrix {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  grid-template-rows: auto;
}

.matrix>span {
  padding: 20px 0;
  text-align: center;
}

答案 3 :(得分:-1)

ID_Name = [{'id': 10, 'name': 'Anna'},
       {'id': 15, 'name': 'Bob'}, 
       {'id': 20, 'name': 'Charlie'},
       {'id': 25, 'name': 'Donald'} ] 

AVG_INCOME = [1000, 1000, 1000, 1000]

ID_income = [ {ID_Name[i]['name']:AVG_INCOME[i]} for i in range(0, 
               len(ID_Name))]
ID_income
>[{'Anna': 1000}, {'Bob': 1000}, {'Charlie': 1000}, {'Donald': 1000}]