pythonnet模块的使用,把DataTable转换成DataFrame

1.模块的选择

  python与c#交互目前有两种方式,一种是使用ironpython模块,另一种是使用pythonnet模块。笔者推荐使用pythonnet,因为ironpython不支持c#中的一些模块,如比较有名的pandas,numpy等。

2.使用pythonnet

  使用pip下载pythonnet模块,在安装路径下会有clr.pyd、python.Runtime.dll 两个文件,pyd文件是在python脚本中使用,而python.Runtime则是在c#程序中所调用的动态库。(注意:下载的pythonnet模块、c#生成的系统位数和使用的IDE位数一致,如:都是x86,或者x64)

3.代码

  

 1 import sys
 2 import os
 3 sys.path.insert(0,os.path.abspath(‘./‘))
 4
 5 import clr
 6 clr.AddReference(‘System.Data‘)
 7
 8 from System import Data
 9 from System.Data import DataSet
10 from System.Data import DataTable
11 from System.Data import DataColumn
12 from System.Data import DataRow
13
14 import pandas as pd
15 import numpy as np
16 from pymongo import MongoClient
17 import types
18 import bson
19
20 def TableToDataFrame(dt):
21     ‘‘‘将DataTable类型转换成DataFrame类型‘‘‘
22     colTempCount = 0
23     dic={}
24     while(colTempCount < dt.Columns.Count):
25         li = []
26         rowTempCount = 0
27         colName = dt.Columns[colTempCount].ColumnName
28         while (rowTempCount < dt.Rows.Count):
29             result = dt.Rows[rowTempCount][colTempCount]
30             li.append(result)
31             rowTempCount = rowTempCount + 1
32
33         colTempCount = colTempCount + 1
34         dic.setdefault(colName,li)
35
36     df = pd.DataFrame(dic)
37     return(df)
38
39 def DataFrameToDic(df):
40     ‘‘‘将DataFrame数据类型转成字典类型‘‘‘
41     dic = df.to_dict(‘list‘)
42     return dic
43
44 def CollenctionMongodb():
45     dataTableList = []
46     client = MongoClient(‘localhost‘,27017)
47     db = client[‘数据库名称‘]
48     c = db[‘表名称‘]
49     dataTableList.append(c)
50     ds = DataSet(object)
51     for dbTable in dataTableList:
52         dt = DataTable(object)
53         dbDR = dbTable.find_one()
54         for dbTable in list(dbDR.keys()):
55             dc = DataColumn(object)
56             dc.ColumnName = a
57             dt.Columns.Add(dc)
58
59         for item in dbTable.find():
60             li = []
61             for b in list(item.values()):
62                 if types.IntType == type(b):
63                     li.append(b)
64                 elif types.StringType == type(b):
65                     li.append(b.encode("utf-8"))
66                 elif isinstance(b,bson.object.Object):
67                     pass
68                 else:
69                     li.append(b)
70
71         dt.Rows.Add(li)
72     ds.Tables.Add(dt)
73     return ds
74
75 if __name__ == ‘__main__‘:
76     ds.CollenctionMongodb()
77     

4、对代码的解释

  以上是程序的主代码,根据需求从mongodb中取出数据,并用python脚本把数据转换成c#里的DataTable类型,再把C#中DataTable类型转换成python 中的DataFrame,接下来就用python中的算法函数来操作数据了,在这个项目中是把操作后的数据用python的字典类型回传给c#程序。c#拿到的数据格式则是json字符串,使用c#解析字符串就能拿到相应的数据。

  c#使用pythonnet.runtime.dll 动态库,具体的使用方法在 pypi 下载pythonnet模块时,查看使用文档会用详细的用法解释。

5、本作者博客写的比较少,写作水平有待提高。因为文笔有限没有对以上代码进行逐句的解释,对c#和python有了解的人看会轻松一些,还请读者多多包涵,希望此文档对读者有一点启发作用,若以上代码有哪里不懂的地方可以留言。

原文地址:https://www.cnblogs.com/-Neo/p/9170452.html

时间: 2024-08-01 19:10:44

pythonnet模块的使用,把DataTable转换成DataFrame的相关文章

C#将DataTable转换成list的方法

本文实例讲述了C#将DataTable转换成list及数据分页的方法.分享给大家供大家参考.具体如下: /// <summary>   /// 酒店评论列表-分页  /// </summary>  /// <param name="userId"></param>  /// <param name="pageIndex">当前页</param>  /// <param name="

将DataTable转换成CSV文件

DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表.CSV文件最早用在简单的数据库里,由于其格式简单,并具备很强的开放性,所以起初被扫图家用作自己图集的标记.CSV文件是个纯文本文件,每一行表示一张图片的许多属性. 在.net项目中运用C#将DataTable转化为CSV文件,现在提供一个较为通用的方法,具体代码如下:         /// <summary>         /// 将DataTable转换成CSV文件         /// &

DataTable转换成IList&lt;T&gt;的简单实现

DataTable的无奈 很多时候,我们需要去操作DataTable.但DataTable的操作,实在是太不方便了.Linq?lambda表达式?统统没有... 特别是对现有结果集做进一步筛选,这样的高频率动作,DataTable却无能为力. 网上很多朋友说用反射实现.那么问题来了,一定要用反射吗? 下面我们用一个不用反射的方式实现: TableToList类 using System; using System.Collections.Generic; using System.Linq; u

DataTable转换成List&lt;T&gt;

很多时候需要将DataTable转换成一组model,直接对model执行操作会更加方便直观. 代码如下: 1 public static class DataTableToModel 2 { 3 public static List<T> ConvertToModel<T>(this DataTable dt) 4 { 5 if (dt == null || dt.Rows.Count == 0) 6 { 7 return null; 8 } 9 10 var result =

将list&lt;对象&gt;转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其他的方法,不过这个方法已经实现,就写一下了: 1.创建表. CREATE TABLE [dbo].[person]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NULL, [Pwd] [nvarchar](50) NULL, [Age]

C# DataTable转换成实体列表 与 实体列表转换成DataTable

/// <summary> /// DataTable转换成实体列表 /// </summary> /// <typeparam name="T">实体 T </typeparam> /// <param name="table">datatable</param> /// <returns></returns> public static IList<T>

将DataTable转换成list

将DataTable转换成list 及数据分页. <1> /// <summary> /// 酒店评论列表-分页 /// </summary> /// <param name="userId"></param> /// <param name="pageIndex">当前页</param> /// <returns></returns> public stat

C# DataTable转换成DataRow

linq中的cast<T>()及OfType<T>() DataTable dt=...........//获取从数据库中取出的数据(假设只有一条记录) //Cast<T>()用来将非泛型的序列转换为泛型的序列 DataRow row=dt.Rows.Cast<DataRow>().Single(); //OfType<T>():用来将序列中可以转换的转换为指定的序列 如:一个object数组中有整数和字符串,现在想找出其中最大的数 object

如何将DataTable转换成List&lt;T&gt;呢?

昨日在工作中,遇到一个问题:需要将查询出来的DataTable数据源,转换成List<T>的泛型集合(已知T类型).第一反应,我想肯定要用到“泛型”(这不是废话吗?都说了要转换成List<T>泛型集合了),而且还要用到“反射”相关的.呵呵.很快,我就做出了一个小实例,测试通过.下面我将代码贴出来,分享给大家.代码都有详细的注释,读者朋友可以很清晰的看懂我的思路. 这是我写的一个通用转换类,完成此类操作 using System; using System.Collections.G