pandas添加一个列,这个列在'MB'列左边,列的数据根据'MB'列变化,如果'MB'列有数据0就填a,有数据1就填b
时间: 2024-01-10 13:05:12 浏览: 64
你可以使用 Pandas 的 `insert` 方法来在指定位置添加一列。假设你要在 "MB" 列的左边添加一个名为 "NewCol" 的列,根据 "MB" 列的值填充为 "a" 或 "b",可以按照以下步骤进行操作:
```python
import pandas as pd
# 创建示例数据
data = {'MB': [0, 1, 0, 1, 0]}
df = pd.DataFrame(data)
# 添加新列
df.insert(0, "NewCol", df["MB"].apply(lambda x: 'a' if x == 0 else 'b'))
# 输出结果
print(df)
```
这将在 "MB" 列的左边添加一个名为 "NewCol" 的新列,并根据 "MB" 列的值填充为 "a" 或 "b"。
相关问题
用pandas库读入csv文件中一列smiles数据,并将其依次转换为mol格式,再用QED模块计算类药性,并写入原csv表格中
以下是一个示例代码,假设csv文件名为data.csv,smiles数据在第一列,需要安装rdkit、pandas和py3Dmol库:
```python
from rdkit import Chem
from rdkit.Chem import QED
import pandas as pd
import py3Dmol
# 读入csv文件
df = pd.read_csv('data.csv')
# 将smiles数据转换为mol格式,并计算QED值
qeds = []
for smiles in df.iloc[:, 0]:
mol = Chem.MolFromSmiles(smiles)
qed = QED.qed(mol)
qeds.append(qed)
# 将QED值添加到原表格中
df['QED'] = qeds
# 展示一个分子的3D结构
mol = Chem.MolFromSmiles(df.iloc[0, 0])
mb = Chem.MolToMolBlock(mol)
v = py3Dmol.view(width=400, height=400)
v.addModel(mb, 'sdf')
v.setStyle({'stick': {}})
v.setBackgroundColor('0xeeeeee')
v.zoomTo()
v.show()
```
这段代码首先读入csv文件,然后用循环将每个smiles数据转换为mol格式,并计算QED值,最后将QED值添加到原表格中。在最后展示了第一个分子的3D结构,需要用py3Dmol库渲染。需要注意的是,这段代码假设smiles数据在第一列,如果不是需要修改`df.iloc[:, 0]`的索引。
python 使用连接池、分批处理和pandans计算,mysql遍历每个表格,表格要加反引号根据trade_date降序排列,对net_mf_amount列的前一天的数据减去今天的数据放在a列,如果之前计算过则跳过,把a列的值前一天的数据减去今天的数据放在b列,并且保存a和b列
好的,我来解答你的问题。
首先,你的问题涉及到了一些技术点,我将逐一解释:
1. 连接池:连接池是一种数据库连接管理技术,它可以避免每次操作数据库都重新建立连接的开销,提高数据库操作的效率。在 Python 中,可以使用第三方库 `pymysql` 来实现连接池的功能。
2. 分批处理:分批处理是一种大数据处理技术,将大数据分成多个小批次进行处理,可以避免内存溢出和提高处理效率。在 Python 中,可以使用 `pandas` 库的 `read_csv` 函数中的 `chunksize` 参数来实现分批处理。
3. pandas 计算:`pandas` 是 Python 中一个强大的数据处理库,可以方便地进行数据清洗、分析和计算。
4. MySQL 遍历表格:可以使用 SQL 语句中的 `SHOW TABLES` 和 `DESCRIBE table_name` 来获取表格信息,使用 `SELECT * FROM table_name` 来遍历表格数据。
现在,我们来回答你的问题:
你的问题是将 MySQL 中的每个表格按照 trade_date 降序排列,并计算 net_mf_amount 前一天的数据减去今天的数据放在 a 列,再将 a 列的值前一天的数据减去今天的数据放在 b 列,并保存 a 和 b 列。如果之前计算过则跳过。
我们可以使用以下步骤来实现:
1. 使用 `pymysql` 库建立一个 MySQL 的连接池,避免每次操作都重新连接数据库。
2. 使用 `SHOW TABLES` 和 `DESCRIBE table_name` 获取每个表格的信息。
3. 使用 `SELECT * FROM table_name ORDER BY trade_date DESC` 遍历每个表格的数据,按照 trade_date 降序排列。
4. 对于每个表格的数据,使用 `pandas` 来进行数据处理和计算。首先读取数据,然后使用 `shift` 函数来获取前一天的数据,计算出 a 列的值,再使用 `shift` 函数来获取 a 列前一天的数据,计算出 b 列的值。
5. 将计算出的 a 和 b 列的值保存到 MySQL 数据库中。
6. 在保存数据之前,需要先检查之前是否已经计算过,如果已经计算过则跳过。
下面是一个示例代码,可以作为参考:
```python
import pymysql
import pandas as pd
from datetime import datetime, timedelta
# 建立 MySQL 连接池
pool = pymysql.connect(
host="localhost",
port=3306,
user="root",
password="password",
database="database_name",
charset="utf8mb4",
cursorclass=pymysql.cursors.DictCursor,
autocommit=True,
max_connections=10
)
# 获取表格列表
cursor = pool.cursor()
cursor.execute("SHOW TABLES")
tables = [table["Tables_in_database_name"] for table in cursor.fetchall()]
# 遍历每个表格
for table in tables:
# 检查是否已经计算过
cursor.execute(f"SELECT COUNT(*) FROM information_schema.columns WHERE table_name='{table}' AND column_name IN ('a', 'b')")
if cursor.fetchone()["COUNT(*)"] == 2:
continue
# 获取表格信息和数据
cursor.execute(f"DESCRIBE {table}")
columns = [column["Field"] for column in cursor.fetchall()]
data = pd.read_sql(f"SELECT * FROM {table} ORDER BY trade_date DESC", pool, chunksize=1000)
# 计算 a 和 b 列的值,并保存到数据库中
for chunk in data:
# 计算 a 列的值
chunk["a"] = chunk["net_mf_amount"] - chunk["net_mf_amount"].shift(1)
# 计算 b 列的值
chunk["b"] = chunk["a"] - chunk["a"].shift(1)
# 将计算出的 a 和 b 列的值保存到数据库中
chunk[["a", "b"]].to_sql(table, pool, if_exists="append", index=False)
print(f"{table} 计算完成")
```
需要注意的是,上述代码仅作为示例,具体实现需要根据实际情况进行调整。
阅读全文