将数据框中的索引和列与字典进行比较

时间:2019-03-19 19:27:04

标签: python-3.x

我有字典:

import Button from 'Button.vue'
import Vue from 'vue'
var ComponentClass = Vue.extend(Button)
var instance = new ComponentClass({
    propsData: { type: 'primary' }
})
instance.$slots.default = [ 'Click me!' ]
instance.$mount() // pass nothing
this.$refs.container.appendChild(instance.$el)

和一个列表:

d = {'A-A': 1, 'A-B':2, 'A-C':3, 'B-A':5, 'B-B':1, 'B-C':5, 'C-A':3, 
      'C-B':4, 'C-C': 9}

我有一个DataFrame:

L = [A,B,C]

我想根据字典键用字典中的值填充df中的每一行。例如:

df =pd.DataFrame(columns = L, index=L)

我尝试通过以下方式这样做:

   A   B  C
A  1   2  3
B  5   1  5
C  3   4  9

还有另一种方法可以做到这一点,尤其是在有大量数据的情况下?

谢谢您的帮助

2 个答案:

答案 0 :(得分:1)

这是我可以想到的另一种方式:

import numpy as np
import pandas as pd

# given
d = {'A-A': 1, 'A-B':2, 'A-C':3, 'B-A':5, 'B-B':1, 'B-C':5, 'C-A':3, 
      'C-B':4, 'C-C': 9}
L = ['A', 'B', 'C']

# copy the key values into a numpy array
z = np.asarray(list(d.values()))

# reshape the array according to your DataFrame
z_new = np.reshape(z, (3, 3))

# copy it into your DataFrame
df = pd.DataFrame(z_new, columns = L, index=L)

答案 1 :(得分:0)

这应该可以解决问题,尽管这可能不是最佳方式:

for index in L:
    prefix = index + "-"
    df.loc[index] = [d.get(prefix + column, 0) for column in L]

对于小列表,事先单独计算prefix可能会慢一些,对于大列表,可能会更快。

说明

for index in L:

这会遍历所有行名。

    prefix = index + "-"

每行的所有键都以index + "-"开头,例如"A-""B-"…等。

    df.loc[index] = 

设置整个行的内容。

                     [                           for column in L]

与逗号([1, 2, 3])相同,只是用于任意数量的项目。这称为“列表理解”。

                      d.get(                , 0)

这与d[ ]相同,但是如果找不到任何内容,则返回0

                            prefix + column

将列结尾处,例如"A-"给出"A-A""A-B"