python - 如何根据条件从旧数据框创建新数据框
问题描述
我在工作中遇到一种情况,我需要从以前的数据框创建一个新的数据框
之前的数据帧如下所示:|id|name|balance|deleted|minimum_balance|payment_provider_account_id|type|api_user_id|customer_id| |-----|------------|------:|------:|-------------- :|---------------|--------|-|-| |38049|LIDIA CIUBUC|3.58 |-1 |2.0 |lidia.ciubuc |个人|NaN|38049|
新数据框将具有相同的列,但我需要: 检查新数据框上是否已存在前一个数据框上每一行的名称 如果名称不存在,则在新数据框上添加该行 如果存在,我需要检查前一个的删除状态是否为-1 如果不是-1,我需要将前一个数据帧的余额相加到新数据农场如果是-1,我需要将现有余额临时存储在新数据帧上,替换该行通过前一个数据帧中的一个,它们将新数据帧上替换行的临时余额相加。
到目前为止,我的代码是:
import sys, psycopg2
import pandas as pd
conn = psycopg2.connect(host="<db_IP>",port=<DB_port>,dbname="dbname",user="postgres",password="Start123")
cur = conn.cursor()
df = pd.read_sql('SELECT * FROM money_account;',conn)
cur.rowcount
conn.commit()
cur.close()
conn.close()
dc = 1
rc = 0
print(df.loc[0])
rows = df.loc[dc-1]
print(rows)
type(rows)
for x in rows.id:
for y in df.id:
if rows.name[rc] == df.names[dc]:
if df.deleted[dc] != -1:
rows.balance[rc] = rows.balance[rc] + df.balance[dc]
else:
temp = rows.balance[rc]
rows[rc] = df[dc]
rows.balance[rc] = rows.balance[rc] + temp
else:
dc = dc +1
rc = rc + 1
print(rows)
但我收到以下错误:
TypeError Traceback (most recent call last)
<ipython-input-4-316da58d0cb6> in <module>
6 type(rows)
7
----> 8 for x in rows.id:
9 for y in df.id:
10 if rows.name[rc] == df.balance[dc]:
TypeError: 'numpy.int64' object is not iterable
解决方案
似乎以下代码对我有用:
import sys, psycopg2
import pandas as pd
import csv
conn = psycopg2.connect(host="127.0.0.1",port=5433,dbname="YPSDB",user="postgres",password="Start123")
cur = conn.cursor()
df = pd.read_sql('SELECT * FROM money_account;',conn)
cur.rowcount
conn.commit()
cur.close()
conn.close()
df_list = df.values.tolist()
df_items=list(df)
for indout in range(len(df_list)-1):
if df_list[indout][6] == 'PERSONAL':
if df_list[indout][3] == -1:
for indin in range(len(df_list)-1):
if df_list[indout][5] == df_list[indin][5]:
if df_list[indin][3] != -1 & bool(df_list[indin][2] != 0.0):
df_list[indout][2] = round(df_list[indout][2] + df_list[indin][2],2)
lista = [sub for sub in df_list if -1 in sub]
with open('final balance.csv', 'w', encoding='utf-8') as f:
write = csv.writer(f)
write.writerow(df_items)
write.writerows(lista)
当然,我愿意接受改进它的建议
推荐阅读
- mysql - 如何在 MySQL 服务器的“where”中使用案例
- python - 训练和验证分数很高,但测试准确性很差
- sql-server-2016 - 如何使用openjson递归解析JSON字符串
- sql - 在创建 SQL 时需要帮助
- javascript - 使用数据表中的偏移量和限制调用下一个 api
- javascript - Firebase 获取整个父母数据,即使没有有效路径,如何避免这种情况?
- linux - 在 Redhat 中找到使用 java 1.6 的应用程序/路径
- typescript - 可以在打字稿中继承单例类吗?
- loopbackjs - 存储用于 Loopback 4 应用程序的临时变量
- android - 徽章通知未显示在我的选项卡布局中