如何使用python pandas逐行更新数据帧

时间:2018-02-19 17:16:00

标签: python pandas dataframe

我不知道是否可以使用python pandas实现它。这是我试图做的情景

我使用python(pyodbc,sqlalchemy)

创建了与MSSQL的数据库连接

我读了一张表并将其保存为像这样的数据框

data = pd.read_sql_table('ENCOUNTERP1', conn)

,数据框看起来像这样

ENCOUNTERID DIAGCODE DIAGSEQNO POA DIAGVERFLAG
0        78841   3GRNFC         3   P
1        89960                  6
2        86479  N18BZON         9   K
3        69135    MPPY3         9   9           0
4        32422   DS6SBT         2               P
5        69135                  4   D           H
6        92019      PP0         1
7        42105                  2               L
8        99256        U         1               J
9        33940  II9ZODF         3   2
10       33940       OH         1
11       65108   CI6COE         8   U
12       77871   Y3ZHN1         7               S
13       65108  73BJBZV         8   7
14       99256        7         1               T

现在我还有一个数据框(dp = pd.read_sql_table('tblDiagnosis', conn)),其中包含 DIAGCODE 列,它们都是唯一的

我希望从数据框dp获取这些DIAGCODE并将其更新为数据框data['DIAGCODE']

我试着像这样迭代遍历每一行并逐行更新另一个数据帧但是在这段代码中,第二个for循环将每次从0索引开始,所以最后整个行都填充了一个值。

for index, row in dp.iterrows(): 
        for i, r in data.iterrows():
            r['DIAGCODE'] = row['Code']

首先,两个数据框的大小不相等,这是data的数据框

Code Description Category IcdSet 0 001 001 - CHOLERA CHOLERA 9 1 0010 0010 - CHOLERA D/T V. CHOLERAE CHOLERA 9 2 0011 0011 - CHOLERA D/T V. EL TOR CHOLERA 9 3 0019 0019 - CHOLERA NOS CHOLERA 10 4 002 002 - TYPHOID/PARATYPHOID FEV TYPHOID AND PARATYPHOID FEVERS 9 5 0020 0020 - TYPHOID FEVER TYPHOID AND PARATYPHOID FEVERS 9

,输出应该是这样的

ENCOUNTERID DIAGCODE DIAGSEQNO POA DIAGVERFLAG 0 78841 001 3 P 1 89960 0010 6 2 86479 0011 9 K 3 69135 0019 9 9 0 4 32422 002 2 P 5 69135 0020 4 D H

我想从dataframe dp中添加一个像

这样的条件

for index, row in dp.iterrows(): for i, r in data.iterrows(): if row['Code'] == 10: r['DIAGCODE'] = row['Code']

1 个答案:

答案 0 :(得分:1)

我假设这两个表具有相同的行大小,并且都是您想要的所需顺序。如果它是正确的,那么你可以简单地使用:

df = pd.concat([data, pd], axis=1)

然后提取您想要的列:

df = df.ix[;,['ENCOUNTERID','CODE', 'DIAGSEQNO', 'POA', 'DIAGVERFLAG']].rename(columns={'CODE': 'DIAGCODE'})

如果符合您的要求,请投票。

抱歉,.ix已被弃用,即使它仍然可以毫无问题地使用。所以请使用

df = df[['ENCOUNTERID','CODE', 'DIAGSEQNO', 'POA', 'DIAGVERFLAG']].rename(columns={'CODE': 'DIAGCODE'})
顺便说一句,您的代码中的问题是您使用了两个循环,这使得内部循环的最后一个值成为外部循环的最终值。 所以这是解决方案:

for row, r in zip(pd.iterrows(),data.iterrows()):
    r[1]['DIAGCODE']=row[1]['CODE']