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

DataTable转换成List集合是一个常见的编程任务,特别是在.NET框架中,DataTable通常用来表示内存中的数据表。下面是一个如何实现这种转换的步骤说明: 1. 创建DataTable对象并填充数据。 2. 定义一个与DataTable中行结构相对应的类(Poco类)。 3. 使用反射、Linq或其他方法遍历DataTable的每一行,并将其转换为Poco类的实例。 4. 将这些实例添加到List集合中。 以下是使用C#中的Linq to Dataset功能的示例代码: ```csharp using System; using System.Collections.Generic; using System.Data; using System.Linq; public class DataEntity { // 假设你的DataTable中有Name和Age两列 public string Name { get; set; } public int Age { get; set; } } public class Program { public static void Main() { // 创建一个DataTable并添加列和行数据 DataTable dt = new DataTable(); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Age", typeof(int)); dt.Rows.Add("Alice", 25); dt.Rows.Add("Bob", 22); dt.Rows.Add("Charlie", 30); // 使用Linq将DataTable转换为List<DataEntity> List<DataEntity> dataList = dt.AsEnumerable() .Select(row => new DataEntity { Name = row.Field<string>("Name"), Age = row.Field<int>("Age") }) .ToList(); // 此时dataList包含了DataTable中的所有数据 } } ``` 在这个示例中,我们首先定义了一个名为`DataEntity`的类,它具有与DataTable中列对应的属性。然后我们创建了一个DataTable并添加了一些数据。使用Linq的`AsEnumerable()`方法将DataTable转换为可枚举类型,然后使用`Select`方法将每一行转换为`DataEntity`类的实例,并最终调用`ToList()`方法将结果转换为List集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值