首页 > 解决方案 > 如何根据条件从旧数据框创建新数据框

问题描述

我在工作中遇到一种情况,我需要从以前的数据框创建一个新的数据框

之前的数据帧如下所示:|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

标签: pythonpandaspostgresqldataframepostgresql-9.2

解决方案


似乎以下代码对我有用:

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)

当然,我愿意接受改进它的建议


推荐阅读