字典和dataFrame的相互转换

字典和dataFrame的相互转换

一、字典转dataFrame

1、字典转dataFrame比较简单,直接给出示例:

import pandas as pd
dic = {
'name':['张三','李四','王二','麻子','小红','小兰','小玉','小强','小娟','小明'],
'num':[802,807,801,803,806,805,808,809,800,804],
'height': [183, 161, 163, 163, 156, 186, 184, 154, 153, 174],
'weight': [87, 60, 71, 74, 45, 50, 47, 67, 49, 70],
'gender': ['男', '男', '男', '男', '女', '女', '女', '男', '女', '男'],
'age': [25, 30, 25, 26, 27, 20, 23, 26, 30, 30]
}
df=pd.DataFrame(dic)
print(df)

结果:

字典和dataFrame的相互转换

二、dataFrame转字典

1、DataFrame.to_dict() 函数介绍

pandas中经常用的是 DataFrame.to_dict() 函数将dataFrame转化为字典类型( 字典的查询速度很快

函数DataFrame.to_dict(orient=’dict’, into=

  • orient =’dict’,是函数默认的,转化后的字典形式:{column(列名) : {index(行名) : value(值)}};
  • orient =’list’ ,转化后的字典形式:{column(列名) :{values}};
  • orient =’series’ ,转化后的字典形式:{column(列名) : Series (values) (值)};
  • orient =’split’ ,转化后的字典形式:{‘index’ : [index],’columns’ :[columns],’data’ : [values]};
  • orient =’records’ ,转化后是 list形式:[{column(列名) :value(值)}…{column:value}];
  • orient =’index’ ,转化后的字典形式:{index(值) :{column(列名) : value(值)}};

dataFrame.to_dict() 结果默认 index 是 key ,其他字段是和 index 对应的 value

2、orient =’dict’

  • orient =’dict’ 是函数默认的,转化后的字典形式: *{column(列名) : {index(行名) : value(值)}}
dic1 = df.to_dict()
print(dic1)

结果:

{
'name': {0: '张三', 1: '李四', 2: '王二', 3: '麻子', 4: '小红', 5: '小兰', 6: '小玉', 7: '小强', 8: '小娟', 9: '小明'},
'num': {0: 802, 1: 807, 2: 801, 3: 803, 4: 806, 5: 805, 6: 808, 7: 809, 8: 800, 9: 804},
'height': {0: 183, 1: 161, 2: 163, 3: 163, 4: 156, 5: 186, 6: 184, 7: 154, 8: 153, 9: 174},
'weight': {0: 87, 1: 60, 2: 71, 3: 74, 4: 45, 5: 50, 6: 47, 7: 67, 8: 49, 9: 70},
'gender': {0: '男', 1: '男', 2: '男', 3: '男', 4: '女', 5: '女', 6: '女', 7: '男', 8: '女', 9: '男'},
'age': {0: 25, 1: 30, 2: 25, 3: 26, 4: 27, 5: 20, 6: 23, 7: 26, 8: 30, 9: 30}
}

3、 orient =’list’

  • orient =’list’ ,转化后的字典形式: {column(列名) :{values}};
dic1 = df.to_dict('list')
print(dic1)

结果:

{
'name': ['张三', '李四', '王二', '麻子', '小红', '小兰', '小玉', '小强', '小娟', '小明'],
'num': [802, 807, 801, 803, 806, 805, 808, 809, 800, 804],
'height': [183, 161, 163, 163, 156, 186, 184, 154, 153, 174],
'weight': [87, 60, 71, 74, 45, 50, 47, 67, 49, 70],
'gender': ['男', '男', '男', '男', '女', '女', '女', '男', '女', '男'],
'age': [25, 30, 25, 26, 27, 20, 23, 26, 30, 30]
}

4、orient =’series’

  • orient =’series’ ,转化后的字典形式: *{column(列名) : Series (values) (值)}
dic1 = df.to_dict('series')
print(dic1)

结果:

{
'name':
0    张三
1    李四
2    王二
3    麻子
4    小红
5    小兰
6    小玉
7    小强
8    小娟
9    小明
Name: name, dtype: object,
'num':
0    802
1    807
2    801
3    803
4    806
5    805
6    808
7    809
8    800
9    804
Name: num, dtype: int64,
'height':
0    183
1    161
2    163
3    163
4    156
5    186
6    184
7    154
8    153
9    174
Name: height, dtype: int64,
'weight':
0    87
1    60
2    71
3    74
4    45
5    50
6    47
7    67
8    49
9    70
Name: weight, dtype: int64,
'gender':
0    男
1    男
2    男
3    男
4    女
5    女
6    女
7    男
8    女
9    男
Name: gender, dtype: object,
'age':
0    25
1    30
2    25
3    26
4    27
5    20
6    23
7    26
8    30
9    30
Name: age, dtype: int64}

5、orient =’split’

  • orient =’split’ ,转化后的字典形式: *{‘index’ : [index],’columns’ :[columns],’data’ : [values]}
{'index': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
'columns': ['name', 'num', 'height', 'weight', 'gender', 'age'],
'data': [
['张三', 802, 183, 87, '男', 25],
['李四', 807, 161, 60, '男', 30],
['王二', 801, 163, 71, '男', 25],
['麻子', 803, 163, 74, '男', 26],
['小红', 806, 156, 45, '女', 27],
['小兰', 805, 186, 50, '女', 20],
['小玉', 808, 184, 47, '女', 23],
['小强', 809, 154, 67, '男', 26],
['小娟', 800, 153, 49, '女', 30],
['小明', 804, 174, 70, '男', 30]
]
}

6、orient =’records’

  • orient =’records’ ,转化后是 list形式: *[{column(列名) :value(值)}…{column:value}]
dic1 = df.to_dict('records')
print(dic1)

结果:

[
{'name': '张三', 'num': 802, 'height': 183, 'weight': 87, 'gender': '男', 'age': 25},
{'name': '李四', 'num': 807, 'height': 161, 'weight': 60, 'gender': '男', 'age': 30},
{'name': '王二', 'num': 801, 'height': 163, 'weight': 71, 'gender': '男', 'age': 25},
{'name': '麻子', 'num': 803, 'height': 163, 'weight': 74, 'gender': '男', 'age': 26},
{'name': '小红', 'num': 806, 'height': 156, 'weight': 45, 'gender': '女', 'age': 27},
{'name': '小兰', 'num': 805, 'height': 186, 'weight': 50, 'gender': '女', 'age': 20},
{'name': '小玉', 'num': 808, 'height': 184, 'weight': 47, 'gender': '女', 'age': 23},
{'name': '小强', 'num': 809, 'height': 154, 'weight': 67, 'gender': '男', 'age': 26},
{'name': '小娟', 'num': 800, 'height': 153, 'weight': 49, 'gender': '女', 'age': 30},
{'name': '小明', 'num': 804, 'height': 174, 'weight': 70, 'gender': '男', 'age': 30}
]

7、orient =’index’

  • orient =’index’ ,转化后的字典形式: *{index(值) :{column(列名) : value(值)}}
dic1 = df.to_dict('index')
print(dic1)

结果:

{
0: {'name': '张三', 'num': 802, 'height': 183, 'weight': 87, 'gender': '男', 'age': 25},
1: {'name': '李四', 'num': 807, 'height': 161, 'weight': 60, 'gender': '男', 'age': 30},
2: {'name': '王二', 'num': 801, 'height': 163, 'weight': 71, 'gender': '男', 'age': 25},
3: {'name': '麻子', 'num': 803, 'height': 163, 'weight': 74, 'gender': '男', 'age': 26},
4: {'name': '小红', 'num': 806, 'height': 156, 'weight': 45, 'gender': '女', 'age': 27},
5: {'name': '小兰', 'num': 805, 'height': 186, 'weight': 50, 'gender': '女', 'age': 20},
6: {'name': '小玉', 'num': 808, 'height': 184, 'weight': 47, 'gender': '女', 'age': 23},
7: {'name': '小强', 'num': 809, 'height': 154, 'weight': 67, 'gender': '男', 'age': 26},
8: {'name': '小娟', 'num': 800, 'height': 153, 'weight': 49, 'gender': '女', 'age': 30},
9: {'name': '小明', 'num': 804, 'height': 174, 'weight': 70, 'gender': '男', 'age': 30}
}

8、指定列为key生成字典的实现步骤(按行)

1、 set_index用于将想设置为key的列设置为数据框索引

 df.set_index("name", drop=True, inplace=True)

结果:

字典和dataFrame的相互转换
2、使用orient=index参数将索引用作字典键。
dictionary = df.to_dict(orient="index")
print(dictionary)

结果

{
'张三': {'num': 802, 'height': 183, 'weight': 87, 'gender': '男', 'age': 25},
'李四': {'num': 807, 'height': 161, 'weight': 60, 'gender': '男', 'age': 30},
'王二': {'num': 801, 'height': 163, 'weight': 71, 'gender': '男', 'age': 25},
'麻子': {'num': 803, 'height': 163, 'weight': 74, 'gender': '男', 'age': 26},
'小红': {'num': 806, 'height': 156, 'weight': 45, 'gender': '女', 'age': 27},
'小兰': {'num': 805, 'height': 186, 'weight': 50, 'gender': '女', 'age': 20},
'小玉': {'num': 808, 'height': 184, 'weight': 47, 'gender': '女', 'age': 23},
'小强': {'num': 809, 'height': 154, 'weight': 67, 'gender': '男', 'age': 26},
'小娟': {'num': 800, 'height': 153, 'weight': 49, 'gender': '女', 'age': 30},
'小明': {'num': 804, 'height': 174, 'weight': 70, 'gender': '男', 'age': 30}
}

3、将步骤1、2合起来写也可以,这里不修改源数据

dictionary = df.set_index("name", drop=True).to_dict(orient="index")

9、指定列为key,value生成字典的实现

1、指定一个列为key,一列为value

dictionary  = df.set_index("name")["num"].to_dict()
print(dictionary)

结果

{
'张三': 802,
'李四': 807,
'王二': 801,
'麻子': 803,
'小红': 806,
'小兰': 805,
'小玉': 808,
'小强': 809,
'小娟': 800,
'小明': 804
}

2、指定多个列为key,一列为value

dictionary  = df.set_index(["name","num"])["weight"].to_dict()
print(dictionary)

结果:

{
('张三', 802): 87,
('李四', 807): 60,
('王二', 801): 71,
('麻子', 803): 74,
('小红', 806): 45,
('小兰', 805): 50,
('小玉', 808): 47,
('小强', 809): 67,
('小娟', 800): 49,
('小明', 804): 70
}

3、指定一个列为key,多列为value

方法1(速度慢)

dictionary = {c0:[c1,c2] for c0,c1,c2 in zip(df['name'],df['num'],df['weight'])}
print(dictionary)

方法2(速度快)

dictionary = df[["name",'num','weight']].set_index('name').T.to_dict('list')
print(dictionary)

结果:

{
'张三': [802, 87],
'李四': [807, 60],
'王二': [801, 71],
'麻子': [803, 74],
'小红': [806, 45],
'小兰': [805, 50],
'小玉': [808, 47],
'小强': [809, 67],
'小娟': [800, 49],
'小明': [804, 70]
}

4、 指定多列为key,多列为value

dictionary = df[["name",'num','weight',"age"]].set_index(['name','num']).T.to_dict('list')
print(dictionary)

结果:

{
('张三', 802): [87, 25],
('李四', 807): [60, 30],
('王二', 801): [71, 25],
('麻子', 803): [74, 26],
('小红', 806): [45, 27],
('小兰', 805): [50, 20],
('小玉', 808): [47, 23],
('小强', 809): [67, 26],
('小娟', 800): [49, 30],
('小明', 804): [70, 30]
}

参考
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_dict.html

Original: https://blog.csdn.net/m0_43609475/article/details/125328938
Author: 淡定的炮仗
Title: 字典和dataFrame的相互转换



相关阅读

Title: 机器学习——Logistics回归

Logistics回归:极大似然法

对数几率

字典和dataFrame的相互转换

因此有:

字典和dataFrame的相互转换

Logisitics回归:极大似然法估计recap

确定待求解的未知参数θ1,θ2,……θn,如均值,方差或特定分布函数等

计算每个样本X1 , X2 , . . . , Xn的概率密度 f(Xi; θ1 , . . . , θm).

假定样本i.i.d,则可根据样本的概率密度累乘构造似然函数:

字典和dataFrame的相互转换

通过似然函数最大化(求导为零),求解未知参数 θ

为降低计算难度,通常可采用对数加法替换概率乘法,通 过导数为零/极大值来求解未知参数

UCI Machine Learning Repository: Breast Cancer Wisconsin (Original) Data Set

数据库借用的康威斯星州乳腺癌的数据集

我将其中的10与8改成了0,增加数据集数据错误率

1.改进的随机梯度上升算法

def stocGradAscent1(dataMatrix, classLabels, numIter=150):
    m,n = shape(dataMatrix)
    weights = ones(n)   #initialize to all ones
    for j in range(numIter):
        dataIndex = range(m)
        for i in range(m):
            alpha = 4/(1.0+j+i)+0.0001    #apha decreases with iteration, does not
            randIndex = int(random.uniform(0,len(dataIndex)))#go to 0 because of the constant
            h = sigmoid(sum(dataMatrix[randIndex]*weights))
            error = classLabels[randIndex] - h
            weights = weights + alpha * error * dataMatrix[randIndex]
            del(dataIndex[randIndex])
    return weights

def classifyVector(inX, weights):
    prob = sigmoid(sum(inX*weights))
    if prob > 0.5: return 1.0
    else: return 0.0

def colicTest():
    frTrain = open('breast-cancer-wisconsin.txt'); frTest = open('breast-cancer-wisconsin-train.txt')
    trainingSet = []; trainingLabels = []
    for line in frTrain.readlines():
        currLine = line.strip().split(',')
        lineArr =[]
        for i in range(10):
            lineArr.append(float(currLine[i]))
        trainingSet.append(lineArr)
        trainingLabels.append(float(currLine[10]))
    trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 1000)
    errorCount = 0; numTestVec = 0.0
    for line in frTest.readlines():
        numTestVec += 1.0
        currLine = line.strip().split(',')
        lineArr =[]
        for i in range(10):
            lineArr.append(float(currLine[i]))
        if int(classifyVector(array(lineArr), trainWeights))!= int(currLine[10]):
            errorCount += 1
    errorRate = (float(errorCount)/numTestVec)
    print "the error rate of this test is: %f" % errorRate
    return errorRate

def multiTest():
    numTests = 10; errorSum=0.0
    for k in range(numTests):
        errorSum += colicTest()
    print "after %d iterations the average error rate is: %f" % (numTests, errorSum/float(numTests))

输出结果为

字典和dataFrame的相互转换

0(即未收集数据)占总数据的百分比约为13%,而利用改进的随机梯度算法错误率仅仅20%,可以说效率非常高

2.随机梯度上升算法

def stocGradAscent0(dataMatrix, classLabels):
    m,n = shape(dataMatrix)
    alpha = 0.01
    weights = ones(n)   #initialize to all ones
    for i in range(m):
        h = sigmoid(sum(dataMatrix[i]*weights))
        error = classLabels[i] - h
        weights = weights + alpha * error * dataMatrix[i]
    return weights

利用此算法计算的错误率结果为

字典和dataFrame的相互转换

可以看出相比改进的随机梯度上升算法来看,错误率明显提高不少

所以改进的随机梯度上升算法更好

Original: https://blog.csdn.net/Mei_Ying_/article/details/121458259
Author: 蓝の影
Title: 机器学习——Logistics回归

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/222759/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总